ç¹å®ã®Dockerã¤ã¡ã¼ã¸ãAmazon ECSãApp Runnerã§å®è¡ãã¹ãããããã¤ã試ã¿ãã¨ããã以ä¸ã®ãããªã¨ã©ã¼ãçºçãã¾ããã
exec format error
çé¢ç®ã«ããã£ãã®ã§ãä½ãèµ·ãã£ãã®ããæ´çãã¦ããã¾ãã
åæã¨ãã¦ã®Multi-platform builds
ã¾ãåæã¨ãã¦ãDockerã«ã¯Multi-platform buildsã¨ããæ©è½ãããã¾ããããã¯ãè¤æ°ã®ã¢ã¼ããã¯ãã£åãã®ã¤ã¡ã¼ã¸ã1ã¤ã®Dockerfileã§ãã«ãã§ããæ©è½ã§ãlinux/amd64
ãlinux/arm64
ãªã©ã®ç°ãªãã¢ã¼ããã¯ãã£åãã®ã¤ã¡ã¼ã¸ãåæã«ãã«ãã§ãã¾ãã
ããããªãå¿ è¦ãªã®ãã¨ããã¨ãDockerã¤ã¡ã¼ã¸ã®å¯æ¬æ§ãé«ããããã§ãããã³ã³ããã¯ãã¹ãã®ã«ã¼ãã«ã使ããããã軽éãªã®ã§ãããããã¯çµå±ã³ã³ããã®ç¨¼åã¯ãã¹ãã®ã¢ã¼ããã¯ãã£ã«ä¾åãããã¨ãæå³ãã¾ãããã®ãããç°ãªãã¢ã¼ããã¯ãã£åãã®ã¤ã¡ã¼ã¸ããã«ããã¦ãããã¨ã§ãç°ãªãã¢ã¼ããã¯ãã£ã®ãã¹ãã«å¯¾ãã¦ãåãã¤ã¡ã¼ã¸ã使ãã¾ãããã¨ãã§ããã¨ããããã§ããã
ä½ãèµ·ãã£ãã®ã
ECSãApp Runnerã¸ã®ãããã¤ãè¡ãã«ããããåã¯ECRã®ãªãã¸ããªã«ã³ã³ããã¤ã¡ã¼ã¸ãPUSHãããã®ãªãã¸ããªããECSãApp Runnerã«ãããã¤ããã¨ããæµããåãã¾ããã
ãã®ãªãã¬ã¼ã·ã§ã³ã¯Macãç¨ãã¦ã次ã®ããã«è¡ãªã£ãããã§ãã
aws ecr get-login-password --region ap-northeast-1 \ | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com docker pull grafana/grafana:latest docker tag grafana/grafana:latest xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/grafana/grafana:latest docker push xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/grafana/grafana:latest
ããã§åé¡ãæããã«ããã«ãããã2ã¤ã®ãã¤ã³ããããã¾ãã
AWSãµã¼ãã¹ã«ãããCPUã¢ã¼ããã¯ãã£ãµãã¼ã
ECSã«ããã¦ã¯ãEC2ã»Fargateã¨ãã«ãAMD64ãARM64ã¢ã¼ããã¯ãã£ããµãã¼ããã¦ãã¾ãã
- Prerequisites for Amazon EC2 instance support
- Prerequisites for AWS Fargate (Amazon ECS only) support
ãã ããARM64ã®ã¤ã¡ã¼ã¸ã使ãããã«ã¯ãã¿ã¹ã¯å®ç¾©ã«ãã®æ¨ãè¨è¿°ãã¦ãããã°ãªãã¾ããã以ä¸ã¯ Specifying the ARM architecture in an Amazon ECS task definitionããã®å¼ç¨ã§ãã
{ "runtimePlatform": { "operatingSystemFamily": "LINUX", "cpuArchitecture": "ARM64" }, ... }
ä¸æ¹ã§App Runnerã¯ARM64ã¢ã¼ããã¯ãã£ããµãã¼ããã¦ãã¾ãããå ¬å¼ã®ããã¥ã¢ã«ã«ã¯ãã®è¨è¿°ã¯è¦ã¤ãããªãã£ãã®ã§ããããã¯ãå©ç¨ã§ããªãããã§ãã
è¨äºå·çæç¹ã§ã¯ARM64ã®ã³ã³ããã¤ã¡ã¼ã¸ã«ã¯å¯¾å¿ãã¦ããªããããx86_64ã¢ã¼ããã¯ãã£ã®ã¤ã¡ã¼ã¸ã使ç¨ããå¿ è¦ãããã¾ãã
Multi-platform buildsãããã¤ã¡ã¼ã¸ã«å¯¾ããdocker pullã®æå
ããã¦ãdocker pull
ã®å¯¾è±¡ã¤ã¡ã¼ã¸ãMulti-platform buildsãããã¤ã¡ã¼ã¸ã§ããå ´åãDockerã¯ãã¹ãã®ã¢ã¼ããã¯ãã£ã«å¿ãã¦é©åãªã¤ã¡ã¼ã¸ãé¸æãã¾ããä¾ãã°Macã§docker pull
ãè¡ãã¨ããã®æã«pullãããã®ã¯linux/arm64
åãã®ã¤ã¡ã¼ã¸ã§ãã
When you pull the image, the registry returns the manifest list, and Docker automatically selects the correct variant based on the host's architecture. For example, if you run a multi-platform image on an ARM-based Raspberry Pi, Docker selects the linux/arm64 variant. If you run the same image on an x86-64 laptop, Docker selects the linux/amd64 variant (if you're using Linux containers).
èµ·ãã£ããã¨
Macã§docker pull
ãECRã¸ã®PUSHãè¡ã£ãçµæãlinux/arm64
åãã®ã¤ã¡ã¼ã¸ãECRã«PUSHããã¾ãããããã¦ãECSãApp Runnerã«ãããã¤ããéã«ãã®ã¤ã¡ã¼ã¸ã使ããã¨ããã¨ãããããããµã¼ãã¹ã¯AMD64ã¢ã¼ããã¯ãã£ãæ³å®ãã¦ããç¶æ³ã§ãã£ããããexec format error
ãçºçãã¾ããã
解決ç
解決çã¯ç°¡åã§ããECSãApp Runnerã«ãããã¤ããéã«ã¯ã対象ã®ã¢ã¼ããã¯ãã£ã«åãããã¤ã¡ã¼ã¸ãPUSHããããã«ãã¾ãããï¼ãã¡ãããECSã®å ´åã¯ARM64ã«å¯¾å¿ãã¦ããã®ã§ãã¿ã¹ã¯å®ç¾©å´ã§å¯¾å¿ããã®ãæã¾ããã±ã¼ã¹ãããã¾ãï¼ã
è¨ãã¯æãã§ãããã©ãããã°è¯ãã®ããdocker pull
ããã¨ãã«ã--platform
ãªãã·ã§ã³ã§å¯¾è±¡ã®ã¢ã¼ããã¯ãã£ãæ示çã«æå®ãã¾ãããã
docker pull --platform linux/amd64 grafana/grafana:latest
ããã§ã対象ã®ã¢ã¼ããã¯ãã£åãã®ã¤ã¡ã¼ã¸ãPULLãããã¨ãã§ãã¾ãã
ãªããã¤ã¡ã¼ã¸ãã©ã®ã¢ã¼ããã¯ãã£åãã§ãããã¯ãdocker inspect
ã§ç¢ºèªã§ãã¾ãã
docker inspect grafana/grafana --format='{{.Os}}/{{.Architecture}}' linux/amd64