ãœãããŠã§ã¢æ¥çã§ã¯ãããã€ãã®éèŠãªå€åãèµ·ãã£ãŠããŸãã Appleããã¹ãŠã®ãã·ã³ãã«ã¹ã¿ã ARMããŒã¹ã®ã·ãªã³ã³ã«ç§»è¡ããAWSãGraviton2ã€ã³ã¹ã¿ã³ã¹ã§æé«ã®ã³ã¹ããããã®ããã©ãŒãã³ã¹æ¯ãæäŸããŠããããããã¹ãŠã®ãœãããŠã§ã¢ãx86ããã»ããµã§ã®ã¿å®è¡ããå¿ èŠããããšã¯ãã¯ãæåŸ ã§ããŸããã ã³ã³ãããŒã䜿çšããå ŽåãéçºããŒã ãç°ãªãã¢ãŒããã¯ãã£ã䜿çšããŠããå Žåããéçºå ãšã¯ç°ãªãã¢ãŒããã¯ãã£ã«ãããã€ããå Žåã«ããã«ããã©ãããã©ãŒã ã€ã¡ãŒãžãæ§ç¯ããããã«äœ¿çšã§ããåªããããŒã«ãããã€ããããŸãã ãã®æçš¿ã§ã¯ããã®ãããªãã«ãããæé«ã®ããã©ãŒãã³ã¹ãåŒãåºãå Žåã«äœ¿çšã§ããããã€ãã®ãã¿ãŒã³ã玹ä»ããŸãã
ãã«ããã©ãããã©ãŒã ã®ã³ã³ããã€ã¡ãŒãžãæ§ç¯ããã«ã¯ã次ã®ã³ãã³ã docker buildxã䜿çšããŸããBuildx ã¯ã䜿ãæ
£ãã Docker ãŠãŒã¶ãŒ ãšã¯ã¹ããªãšã³ã¹ã§å€ãã®åŒ·åãªãã«ãæ©èœãæå¹ã«ãã Docker ã³ã³ããŒãã³ãã§ãã buildxãä»ããŠå®è¡ããããã¹ãŠã®ãã«ãã¯ã Mobyãã«ãããã ãã«ããŒãšã³ãžã³ã§å®è¡ãããŸãã Buildx ã¯ãã¹ã¿ã³ãã¢ãã³ã§äœ¿çšããããšããããšãã°Â Kubernetes ã¯ã©ã¹ã¿ãŒã§ãã«ããå®è¡ããããã«äœ¿çšããããšãã§ããŸãã Docker CLI ã®Â 次ã®ããŒãžã§ã³Â ã§ã¯ã docker buildã³ãã³ããããã©ã«ãã§ Buildx ã®äœ¿çšãéå§ããŸãã
æ¢å®ã§ã¯ãBuildx ã§å®è¡ããããã«ãã¯ãã³ã³ãã¥ãŒã¿ãŒã«äžèŽããã¢ãŒããã¯ãã£ã®ã€ã¡ãŒãžããã«ãããŸãã ãã®ããã«ããŠãäœæ¥ããŠããã®ãšåããã·ã³ã§å®è¡ãããã€ã¡ãŒãžãååŸããŸãã å¥ã®ã¢ãŒããã¯ãã£çšã«ãã«ãããã«ã¯ããã©ã°ãèšå®ã§ããŸã--platform ã--platform=linux/arm64. è€æ°ã®ãã©ãããã©ãŒã çšã«ãŸãšããŠãã«ãããã«ã¯ãã³ã³ãåºåãèšå·ã䜿çšããŠè€æ°ã®å€ãèšå®ã§ããŸãã
# building an image for two platforms
docker buildx build --platform=linux/amd64,linux/arm64 .
ãã«ããã©ãããã©ãŒã ã€ã¡ãŒãžã®æ§ç¯ã¯çŸåšãDocker-containerããã³kubernetesãã©ã€ããŒã§BuildKitã䜿çšããŠããå Žåã«ã®ã¿ãµããŒããããŠããããããã«ããã©ãããã©ãŒã ã€ã¡ãŒãžãæ§ç¯ããã«ã¯ã ãã«ããŒã€ã³ã¹ã¿ã³ã¹ãäœæÂ ããå¿ èŠããããŸãã 1 ã€ã®ã¿ãŒã²ãã ãã©ãããã©ãŒã ã®èšå®ã¯ããã¹ãŠã® buildx ãã©ã€ããŒã§èš±å¯ãããŠããŸãã
docker buildx create --use
# building an image for two platforms
docker buildx build --platform=linux/amd64,linux/arm64 .
Dockerfile ãããã«ããã©ãããã©ãŒã ã€ã¡ãŒãžããã«ãããå Žåãå®è³ªçã«ã¯ãDockerfile ã¯ãã©ãããã©ãŒã ããšã« 1 åãã«ããããŸãã ãã«ãã®æåŸã«ããããã®ã€ã¡ãŒãžã¯ãã¹ãŠ 1 ã€ã®ãã«ããã©ãããã©ãŒã ã€ã¡ãŒãžã«ããŒãžãããŸãã
FROM alpine
RUN echo "Hello" > /hello
ããšãã°ã2ã€ã®ã¢ãŒããã¯ãã£çšã«æ§ç¯ããããã®ãããªåçŽãªDockerfileã®å ŽåãBuildKitã¯2ã€ã®ç°ãªãããŒãžã§ã³ã®Alpineã€ã¡ãŒãž(1ã€ã¯x86ãã€ããªãå«ã¿ããã1ã€ã¯arm64ãã€ããªãå«ã)ããã«ããããããã§ããããã®ã·ã§ã«ãã€ããªãå®è¡ããŸãã
ããŸããŸãªæ§ç¯æ¹æ³
äžè¬ã«ããã·ã³ã®CPUã¯ããã€ãã£ãã¢ãŒããã¯ãã£ã®ãã€ããªã®ã¿ãå®è¡ã§ããŸãã x86 CPU 㯠ARM ãã€ããªãå®è¡ã§ããããã®éãåæ§ã§ãã ã§ã¯ãäžèšã®äŸãIntelãã·ã³ã§å®è¡ããŠããå ŽåãARMã®ã·ã§ã«ãã€ããªãã©ã®ããã«å®è¡ã§ããŸãã? ããã¯ãçŽæ¥è¡ãã®ã§ã¯ãªãããœãããŠã§ã¢ãšãã¥ã¬ãŒã¿ãä»ããŠãã€ããªãå®è¡ããããšã«ãã£ãŠè¡ãããŸãã
docker buildx ls åãã«ããŒã«ã€ã³ã¹ããŒã«ãããŠãããšãã¥ã¬ãŒã¿ãŒã瀺ããŸãã ã·ã¹ãã ã«ãªã¹ããããŠããªãå Žåã¯ãã€ã¡ãŒãžã䜿çšããŠÂ tonistiigi/binfmt ã€ã³ã¹ããŒã«ã§ããŸãã
ãã®æ¹æ³ã§ãšãã¥ã¬ãŒã¿ã䜿çšããã®ã¯éåžžã«ç°¡åã§ãã Dockerfileã倿Žããå¿ èŠã¯ãŸã£ãããªããè€æ°ã®ãã©ãããã©ãŒã çšã«èªåçã«ãã«ãã§ããŸãã ããããããã«ã¯æ¬ ç¹ããªãããã§ã¯ãããŸããã ãã®ããã«å®è¡ããããã€ããªã¯ãã¢ãŒããã¯ãã£éã§åœä»€ãåžžã«å€æããå¿ èŠãããããããã€ãã£ãã®é床ã§ã¯å®è¡ãããŸããã å Žåã«ãã£ãŠã¯ããšãã¥ã¬ãŒã·ã§ã³ã¬ã€ã€ãŒÂ ã§ãã°ãåŒãèµ·ãã ã±ãŒã¹ãèŠã€ããããšããããŸãã
ãã®ãªãŒããŒããããåé¿ãã 1 ã€ã®æ¹æ³ã¯ãæãé·ãå®è¡ãããã³ãã³ãããšãã¥ã¬ãŒã¿ãŒãä»ããŠå®è¡ãããªãããã« Dockerfile ã倿Žããããšã§ãã 代ããã«ã ã¯ãã¹ã³ã³ãã€ã«ã¹ããŒãžã䜿çšã§ããŸãã
ãšãã¥ã¬ãŒã·ã§ã³ãšã¯ãã¹ã³ã³ãã€ã«ã®éãã¯ãåè ã§ã¯ãœãããŠã§ã¢ã§å¥ã®ã¢ãŒããã¯ãã£ã®å®å šãªã·ã¹ãã ããšãã¥ã¬ãŒãããã®ã«å¯Ÿããã¯ãã¹ã³ã³ãã€ã«ã§ã¯ãã¿ãŒã²ããã¢ãŒããã¯ãã£çšã®æ°ãããã€ããªãçæããç¹å¥ãªæ§æãªãã·ã§ã³ãåãããã€ãã£ãã¢ãŒããã¯ãã£çšã«æ§ç¯ããããã€ããªã®ã¿ã䜿çšããããšã§ãã ååã瀺ãããã«ããã®ææ³ã¯ãã¹ãŠã®ããã»ã¹ã«äœ¿çšã§ããããã§ã¯ãªããã»ãšãã©ã®å Žåãã³ã³ãã€ã©ãå®è¡ããŠããå Žåã«ã®ã¿äœ¿çšã§ããŸãã 幞ããªããšã«ã2ã€ã®ææ³ãçµã¿åãããããšãã§ããŸãã ããšãã°ãDockerfile ã§ã¯ããšãã¥ã¬ãŒã·ã§ã³ã䜿çšããŠããã±ãŒãž ãããŒãžã£ãŒããããã±ãŒãžãã€ã³ã¹ããŒã«ããã¯ãã¹ã³ã³ãã€ã«ã䜿çšããŠãœãŒã¹ ã³ãŒãããã«ãã§ããŸãã

ãšãã¥ã¬ãŒã·ã§ã³ãšã¯ãã¹ã³ã³ãã€ã«ã®ã©ã¡ãã䜿çšããããæ±ºå®ããå Žåãèæ ®ãã¹ãæãéèŠãªããšã¯ãããã»ã¹ãå€ãã®CPUåŠçèœåã䜿çšããŠãããã©ããã§ãã ãšãã¥ã¬ãŒã·ã§ã³ã¯éåžžãããã±ãŒãžãã€ã³ã¹ããŒã«ããå Žåãããã¡ã€ã«ãäœæãããã1åéãã®ã¹ã¯ãªãããå®è¡ãããããå¿ èŠãããå Žåã«é©ããæ¹æ³ã§ãã ããããã¯ãã¹ã³ã³ãã€ã«ã䜿çšãããšãã«ã(ããããæ°åå)ãéããªãå Žåã¯ãDockerfileãæŽæ°ãã䟡å€ããããŸãã ãã«ãã®äžéšãšããŠãã¹ããå®è¡ãããå Žåãã¯ãã¹ã³ã³ãã€ã«ã§ã¯ãããéæã§ããŸããã ãã®å Žåã«æé«ã®ããã©ãŒãã³ã¹ãåŸãã«ã¯ãã¢ãŒããã¯ãã£ã®ç°ãªãè€æ°ã®ãã·ã³ã§Â ãªã¢ãŒããã«ãã¯ã©ã¹ã¿ãŒÂ ã䜿çšãããšããå¥ã®ãªãã·ã§ã³ããããŸãã
ããã«ãŒãã¡ã€ã«ã®æºå
Dockerfileã«ã¯ãã¹ã³ã³ãã€ã«ã远å ããããã«ã ãã«ãã¹ããŒãžãã«ãã䜿çšããŸãã ãã«ãã¹ããŒãžãã«ãã§äœ¿çšããæãäžè¬çãªãã¿ãŒã³ã¯ããã«ãã¢ãŒãã£ãã¡ã¯ããæºåãããã«ãã¹ããŒãžãšãæçµã€ã¡ãŒãžãšããŠãšã¯ã¹ããŒãããã©ã³ã¿ã€ã ã¹ããŒãžãå®çŸ©ããããšã§ãã ããã§ã¯åãã¡ãœããã䜿çšããŸããããã«ãã¹ããŒãžã§åžžã«ãã€ãã£ãã¢ãŒããã¯ãã£ã®ãã€ããªãå®è¡ããã©ã³ã¿ã€ã ã¹ããŒãžã«ã¿ãŒã²ããã¢ãŒããã¯ãã£ã®ãã€ããªãå«ãããšãã远å ã®æ¡ä»¶ããããŸãã
次ã®ãããªÂ FROM debian ã³ãã³ãã§ãã«ãã¹ããŒãžãéå§ãããšããã«ãäžã«ãã©ã°ã§Â --platform èšå®ãããå€ã«äžèŽããDebianã€ã¡ãŒãžããã«ããããã«ãã«ããŒã«æç€ºããŸãã 代ããã«ç§ãã¡ããããã®ã¯ããã®Debianã€ã¡ãŒãžãåžžã«çŸåšã®ãã·ã³ã«ãã€ãã£ãã§ããããšã確èªããããšã§ãã x86ã·ã¹ãã ã䜿çšããŠããå Žåã¯ã代ããã«æ¬¡ã®ãããªÂ FROM --platform=linux/amd64 debianã³ãã³ãã䜿çšã§ããŸãã ããã§ããã«ãäžã«èšå®ããããã©ãããã©ãŒã ã«é¢ä¿ãªãããã®æ®µéã¯åžžã«amd64ã«åºã¥ããŠããŸãã æ°ããAppleMacã®ãããªARMãã·ã³ã«åãæ¿ãããšã©ããªãããé€ããŠ? ããã§ããã¹ãŠã®Dockerãã¡ã€ã«ã倿Žããå¿
èŠããããŸãã? çãã¯ããŒã§ããã宿°ã®ãã©ãããã©ãŒã å€ãDockerfileã«æžã蟌ã代ããã«ãFROM --platform=$BUILDPLATFORM debian代ããã«å€æ°ã䜿çšããå¿
èŠããããŸãã
BUILDPLATFORM ã¯ã䜿çšã§ãã èªåå®çŸ© (ã°ããŒãã« ã¹ã³ãŒã) ãã«ãåŒæ°Â ã®ã»ããã®äžéšã§ãã ããã¯åžžã«ãã©ãããã©ãŒã ãŸãã¯çŸåšã®ã·ã¹ãã ãšäžèŽãããã«ããŒã¯ç§ãã¡ã®ããã«æ£ããå€ãå
¥åããŸãã
ãã®ãããªå€æ°ã®å®å šãªãªã¹ãã¯æ¬¡ã®ãšããã§ãã
BUILDPLATFORM â matches the current machine. (e.g. linux/amd64)
BUILDOS â os component of BUILDPLATFORM, e.g. linux
BUILDARCH â e.g. amd64, arm64, riscv64
BUILDVARIANT â used to set ARM variant, e.g. v7
TARGETPLATFORM â The value set with --platform flag on build
TARGETOS - OS component from --platform, e.g. linux
TARGETARCH - Architecture from --platform, e.g. arm64
TARGETVARIANT
ãã«ã段éã§ã¯ããœãŒã¹ã³ãŒãããã«ãããã䜿çšãããã³ã³ãã€ã©ããã±ãŒãžãã€ã³ã¹ããŒã«ãããã§ããŸãã ãããã®ã³ãã³ãã¯ãåäžãã©ãããã©ãŒã ãŸãã¯ãšãã¥ã¬ãŒã·ã§ã³ããŒã¹ã® Dockerfile ã§æ¢ã«äœ¿çšããŠããã³ãã³ããšåãã§ããå¿ èŠããããŸãã
ããã§è¡ãå¿ èŠãããå¯äžã®è¿œå ã®å€æŽã¯ãã³ã³ãã€ã©ããã»ã¹ãåŒã³åºããšãã«ãå®éã®ã¿ãŒã²ããã¢ãŒããã¯ãã£ã®ã¢ãŒãã£ãã¡ã¯ããè¿ãããã«æ§æãããã©ã¡ãŒã¿ãŒãæž¡ãå¿ èŠãããããšã§ãã ãã«ãã¹ããŒãžã«ã¯åžžã«ãã¹ãã®ãã€ãã£ãã¢ãŒããã¯ãã£ã®ãã€ããªãå«ãŸããŠãããããã³ã³ãã€ã©ã¯ç°å¢ããã¿ãŒã²ããã®ã¢ãŒããã¯ãã£ãèªåçã«æ±ºå®ã§ããªããªã£ãããšã«æ³šæããŠãã ããã
ã¿ãŒã²ããã¢ãŒããã¯ãã£ãæž¡ãããã«ãåã«ç€ºããã®ãšåãèªåçã«å®çŸ©ããããã«ãåŒæ°ããä»åã¯ãã¬ãã£ãã¯ã¹ä»ã TARGET* ã§äœ¿çšã§ããŸãã ã¹ããŒãžå
ã§ãããã®ãã«ãåŒæ°ã䜿çšããŠããããã 䜿çšããåã«ããŒã«ã«ã¹ã³ãŒã å
ã«ãããã³ãã³ãã§Â ARG 宣èšããå¿
èŠããããŸãã
FROM --platform=$BUILDPLATFORM alpine AS build
# RUN <install build dependecies/compiler>
# COPY <source> .
ARG TARGETPLATFORM
RUN compile --target=$TARGETPLATFORM -o /out/mybinary
ããšã¯ããã«ãã®çµæãšããŠãšã¯ã¹ããŒãããã©ã³ã¿ã€ã ã¹ããŒãžãäœæããã ãã§ãã ãã®æ®µéã§ã¯ãå®çŸ©ã§ã¯Â FROM 䜿çšÂ --platform ããŸãããæžã FROM --platform=$TARGETPLATFORM ããšã¯ã§ããŸããããšã«ããããããã¹ãŠã®ãã«ãã¹ããŒãžã®ããã©ã«ãå€ã§ããããããã©ã°ã®äœ¿çšã¯åé·ã§ãã
FROM alpine
# RUN <install runtime dependencies installed via emulation>
COPY --from=build /out/mybinary /bin
確èªã®ããã«ãäžèšã®Dockerfileã2ã€ã®ãã©ãããã©ãŒã çšã«ãã«ããããå Žåã«äœãèµ·ããããèŠãŠã¿ãŸãããã docker buildx build --platform=linux/amd64,linux/arm64 . æ°ããApple M1ãã·ã³ã®ãããªARM64ããŒã¹ã®ã·ã¹ãã ã§åŒã³åºãããŸãã
ãŸãããã«ããŒã¯ ARM64 ã® Alpine ã€ã¡ãŒãžããã«ããŠã³ãããã«ãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠããœãŒã¹ãã³ããŒããŸãã ãããã®æé ã¯ã2 ã€ã®ç°ãªããã©ãããã©ãŒã çšã«ãã«ãããŠããå Žåã§ããäžåºŠã ãå®è¡ãããããšã«æ³šæããŠãã ãããBuildKit ã¯ããããã®ãã©ãããã©ãŒã ã®äž¡æ¹ãåãã³ã³ãã€ã©ãšãœãŒã¹ã³ãŒãã«äŸåããŠããããšãçè§£ããã®ã«ååã¹ããŒãã§ãããã¹ããããèªåçã«éè€æé€ããŸãã
ããã§ãããã»ã¹ãå®è¡ããŠããã³ã³ãããŒã® 2 ã€ã®åå¥ã®ã€ã³ã¹ã¿ã³ã¹ãåŒã³åºããã compiler ãã©ã°ã«Â --target ç°ãªãå€ãæž¡ãããŸãã
ãšã¯ã¹ããŒã段éã§ã¯ãBuildKit 㯠ARM64 ããŒãžã§ã³ãš x86 ããŒãžã§ã³ã®äž¡æ¹ã® Alpine ã€ã¡ãŒãžããã«ããŠã³ããããã«ãªããŸããã ã©ã³ã¿ã€ã ããã±ãŒãžã䜿çšãããå Žåã¯ããšãã¥ã¬ãŒã·ã§ã³ã¬ã€ã€ãŒã䜿çšããŠx86ããŒãžã§ã³ãã€ã³ã¹ããŒã«ãããŸãã ãããã®ã¹ãããã¯ãã¹ãŠãäŸåé¢ä¿ãå
±æããŠããªãããããã«ãã¹ããŒãžãšäžŠè¡ããŠãã§ã«å®è¡ãããŠããŸãã æåŸã®ã¹ããããšããŠãããããã®Â compiler ããã»ã¹ã«ãã£ãŠäœæããããã€ããªãã¹ããŒãžã«ã³ããŒãããŸãã

ãã®åŸãäž¡æ¹ã®ã©ã³ã¿ã€ã ã»ã¹ããŒãžãOCIã€ã¡ãŒãžã«å€æãããBuildKitã¯ãããã®äž¡æ¹ã®ã€ã¡ãŒãžãå«ã OCIã€ã¡ãŒãžã»ã€ã³ããã¯ã¹Â æ§é (ãããã§ã¹ãã»ãªã¹ããšãåŒã°ãã)ãæºåããŸãã
å²ç¢ã®äŸ
颿°çãªäŸãšããŠãGoããã°ã©ãã³ã°èšèªã§æžããããµã³ãã«ãããžã§ã¯ããèŠãŠã¿ãŸãããã
åçŽãª Go ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžè¬çãªãã«ãã¹ããŒãž Dockerfile ã¯æ¬¡ã®ããã«ãªããŸãã
FROM golang:1.17-alpine AS build
WORKDIR /src
COPY . .
RUN go build -o /out/myapp .
FROM alpine
COPY --from=build /out/myapp /bin
Goã§ã¯ãã¹ã³ã³ãã€ã«ã䜿çšããã®ã¯ãšãŠãç°¡åã§ãã ããªããããå¿
èŠãããå¯äžã®ããšã¯ãç°å¢å€æ°ãæã€ã¿ãŒã²ããã¢ãŒããã¯ãã£ãæž¡ãããšã§ããgo build ãç°å¢å€æ°ãçè§£ããŸã GOOSGOARCH ã32ãããã·ã¹ãã ã®ARMããŒãžã§ã³ãæå®ããããã®ãã®ããããŸã GOARM ã
GOOS ãšÂ GOARCH ã®å€ã¯ãBuildKit ã Dockerfile å
ã§äœ¿çšã§ããããã«ããããã«åã«èŠã and TARGETARCH å€ãšåã圢åŒÂ TARGETOS ã§ãã
以åã«åŠãã ãã¹ãŠã®æé ãé©çšãããšããã«ãã¹ããŒãžãä¿®æ£ããŠãã©ãããã©ãŒã ãæ§ç¯ãã倿°ãå®çŸ©ã ARG TARGET* ãã¯ãã¹ã³ã³ãã€ã«ãã©ã¡ãŒã¿ãã³ã³ãã€ã©ã«æž¡ããšã次ã®ããã«ãªããŸãã
FROM --platform=$BUILDPLATFORM golang:1.17-alpine AS build WORKDIR /src COPY . . ARG TARGETOS TARGETARCH RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /out/myapp . FROM alpine COPY --from=build /out/myapp /bin
ã芧ã®ãšããã3ã€ã®å°ããªå€æŽãå ããã ãã§æžã¿ãDockerfileã¯ã¯ããã«åŒ·åã§ãã ãããã®å€æŽã«æ¬ ç¹ã¯ãªããDockerfileã¯åŒãç¶ãç§»æ€å¯èœã§ããããã¹ãŠã®ã¢ãŒããã¯ãã£ã§åäœããããšã«æ³šæããŠãã ããã ã¡ããã©ä»ãéãã€ãã£ãã¢ãŒããã¯ãã£çšã«ãã«ããããšããã«ããã¯ããã«é«éã«ãªããŸãã
æ€èšããã远å ã®æé©åãããã€ãèŠãŠã¿ãŸãããã
Goã¢ããªã±ãŒã·ã§ã³ãä»ã®Goã¢ãžã¥ãŒã«ã«äŸåããŠããå ŽåãéåžžãäŸåé¢ä¿ã®ãœãŒã¹ããã£ã¬ã¯ããªå
ã«Â vendor å«ãããããããžã§ã¯ãã«ãã®ãããªãã£ã¬ã¯ããªãå«ãŸããŠããªãå ŽåãGoã³ã³ãã€ã©ã¯ã³ãã³ãã®å®è¡äžã«Â go build ãã¡ã€ã«ã«ãªã¹ããããŠãã go.mod äŸåé¢ä¿ããã«ããŸãã
åŸè
ã®å Žåããã«ããã©ãããã©ãŒã ãã«ãã§ããã»ã¹ã2ååŒã³åºãããããgo build ã(ç¬èªã®ãœãŒã¹ã³ãŒãã¯1åããã³ããŒãããŸããã)ããããã®äŸåé¢ä¿ã2åãã«ãããããšãæå³ããŸãã ã³ãã³ãã§Â ARG TARGETARCH ãã«ãã¹ããŒãžãåå²ããåã«ããããã®äŸåé¢ä¿ãããŠã³ããŒãããããã«Goã«æç€ºããããšã§ããããåé¿ããããšããå§ãããŸãã
FROM --platform=$BUILDPLATFORM golang:1.17-alpine AS build WORKDIR /src COPY go.mod go.sum . RUN go mod download COPY . . ARG TARGETOS TARGETARCH RUN GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /out/myapp .FROM alpine COPY --from=build /out/myapp /bin
ããã§ã2ã€ã®Â go build ããã»ã¹ãå®è¡ããããšãäºåã«ãã«ãããäŸåé¢ä¿ã«ãã§ã«ã¢ã¯ã»ã¹ã§ããŸãã ãŸããããã±ãŒãžãããŠã³ããŒãããåã«ãšgo.sum ãã¡ã€ã«ã®ã¿ã go.mod ã³ããŒãããããéåžžã®ãœãŒã¹ã³ãŒãã倿Žããããšãã«ãã¢ãžã¥ãŒã«ã®ããŠã³ããŒãã®ãã£ãã·ã¥ãç¡å¹ã«ãªããŸããã
å®å
šãæãããã«ãDockerfileå
ã«Â ãã£ãã·ã¥ããŠã³ã ãå«ããŸããããRUN --mount ãªãã·ã§ã³ã䜿çšãããšããœãŒã¹ã³ãŒããžã®ã¢ã¯ã»ã¹ããã«ãã·ãŒã¯ã¬ãããäžæãã£ã¬ã¯ããªããã£ãã·ã¥ãã£ã¬ã¯ããªã«äœ¿çšã§ããã³ãã³ãã«æ°ããããŠã³ããã€ã³ããå
¬éã§ããŸãã ãã£ãã·ã¥ããŠã³ãã¯ã次ã«ãã«ããŒãå床åŒã³åºãããšãã«å衚瀺ãããã¢ããªã±ãŒã·ã§ã³åºæã®ãã£ãã·ã¥ãã¡ã€ã«ãæžã蟌ãããšãã§ããæ°žç¶ãã£ã¬ã¯ããªãäœæããŸãã ããã«ããããœãŒã¹ ã³ãŒãã«å€æŽãå ããåŸã«ã€ã³ã¯ãªã¡ã³ã¿ã« ãã«ããå®è¡ãããšãã«ãããã©ãŒãã³ã¹ã倧å¹
ã«åäžããŸãã
Goã§ã¯ããã£ãã·ã¥ããŠã³ãã«å€æãããã£ã¬ã¯ããªã¯æ¬¡ã®ãšããã§ã /root/.cache/go-build ãšÂ /go/pkgã 1ã€ç®ã¯Goãã«ããã£ãã·ã¥ã®ããã©ã«ãã®å Žæã§ããã2ã€ç®ã¯ã¢ãžã¥ãŒã«ãããŠã³ããŒãããå Žæã§ã go mod ã ããã¯ããŠãŒã¶ãŒã root ã§ããã GOPATH ã§ããããšãåæãšããŠããŸã /goã
RUN --mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg \
GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /out/myapp .
ããŠã³ã (ããã©ã«ãã¿ã€ã) ã䜿çšããŠÂ type=bind ãœãŒã¹ã³ãŒãã«ããŠã³ãããããšãã§ããŸãã ããã«ãããã䜿çšããŠãã¡ã€ã«ã COPYå®éã«ã³ããŒããéã®ãªãŒããŒããããåé¿ã§ããŸãã Dockerfile ã§ã®ã¯ãã¹ã³ã³ãã€ã«ã§ã¯ããœãŒã¹ ã³ãŒãã®å€æŽã«ãã£ãŠã¿ãŒã²ããåºæã®äŸåé¢ä¿ã®ãã£ãã·ã¥ãç¡å¹ã«ãªããããå®çŸ©Â ARG TARGETPLATFORM ããåã«ãœãŒã¹ãã³ããŒããããªãå Žåã¯ç¹ã«éèŠãªå ŽåããããŸãã ããŠã³ãã¯ããã©ã«ãã§èªã¿åãå°çšã§ããŠã³ãããã type=bind ããšã«æ³šæããŠãã ããã å®è¡äžã®ã³ãã³ãã§ãœãŒã¹ã»ã³ãŒãã«ãã¡ã€ã«ãæžã蟌ãå¿
èŠãããå Žåã§ããããŠã³ãã®ãªãã·ã§ã³ã䜿çšÂ COPY ãŸãã¯èšå®rw ããããšãã§ããŸãã
ããã«ãããå®å šã«æé©åãããå®å šãªã¯ãã¹ã³ã³ãã€ã«Go Dockerfileãå®çŸããŸãã
FROM --platform=$BUILDPLATFORM golang:1.17-alpine AS build
WORKDIR /src
ARG TARGETOS TARGETARCH
RUN --mount=target=. \
--mount=type=cache,target=/root/.cache/go-build \
--mount=type=cache,target=/go/pkg \
GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /out/myapp .
FROM alpine
COPY --from=build /out/myapp /bin
äŸãšããŠãæåã«äœ¿çšãããã«ãã¹ããŒãžã®Dockerfileã䜿çšããŠDocker CLIãã€ããªããã«ãããã®ã«ãããæéãæž¬å®ããæ¬¡ã«æé©åãé©çšãããã€ããªãæ§ç¯ããŸããã ã芧ã®ãšãããéãã¯ããªãåçã§ãã

ãã€ãã£ãã¢ãŒããã¯ãã£ã®ã¿ã®åæãã«ãã§ã¯ãéãã¯ãããããã§ãåœä»€ãå®è¡ãã COPY å¿
èŠããªãããšããã®ããããªå€æŽã ãã§ãã ããããARMãšx86ã®äž¡æ¹ã®CPUçšã«ã€ã¡ãŒãžãæ§ç¯ãããšããã®éãã¯éåžžã«å€§ãããªããŸãã æ°ãã Dockerfile ã§ã¯ãã¢ãŒããã¯ãã£ã 2 åã«ããŠããã«ãæéã 70% ããå¢å ããŸããã (ãã«ãã®äžéšãå
±æãããŠãããã)ã2 çªç®ã®ã¢ãŒããã¯ãã£ã QEMU ãšãã¥ã¬ãŒã·ã§ã³ã§ãã«ããããšããã«ãæéã¯ã»ãŒ 7 åé·ããªããŸãã
远å ãããã£ãã·ã¥ããŠã³ãã®è¿œå ã®å©ããåããŠãGoãœãŒã¹ã³ãŒãã®å€æŽã«ããå¢ååæ§ç¯ã¯ãå€ãDockerfileãšæ¯èŒããŠã°ããã100åã®é床åäžã®é åã«éããŠããŸãã