Dockerfile 1.4 ããã³ Buildx v0.8+ ã®æ°ãããªãªãŒã¹ã«ã¯ãè€æ°ã®ãã«ã ã³ã³ããã¹ããå®çŸ©ããæ©èœãä»å±ããŠããŸããã€ãŸãããã«ãã®äžéšãšããŠç°ãªãããŒã«ã«ãã£ã¬ã¯ããªã®ãã¡ã€ã«ã䜿çšã§ããŸãã ãªãããã圹ç«ã€ã®ãããããŠãã«ããã€ãã©ã€ã³ã§ã©ã®ããã«æŽ»çšã§ããã®ããèŠãŠã¿ãŸãããã
ã³ãã³ããåŒã³åºã docker build ãšããã«ã ã³ã³ããã¹ããžã®ãã¹ãŸã㯠URL ã§ãã 1 ã€ã®äœçœ®åŒæ°ãåããŸãã æãäžè¬çã«ã¯ docker build . ã çŸåšã®äœæ¥ãã£ã¬ã¯ããªããã«ãã³ã³ããã¹ãã«ããã
å
éš Dockerfile ã§ã¯ãããã³ ADD ã³ãã³ãã䜿çšããŠããã«ãã³ã³ããã¹ããããã¡ã€ã«ãã³ããŒãããã«ãã¹ãããã§äœ¿çšã§ããããã«ããããšãã§ããŸã COPY ãBuildKit ã§ã¯ããã«ãã³ã³ããã¹ããã¡ã€ã«ãã³ããŒããã«çŽæ¥ã¢ã¯ã»ã¹ã§ãããã«ãããŠã³ã RUN --mount ã远å ãããããã©ãŒãã³ã¹ãåäžããŸããã
è€éãªãã«ãã®åŸæ
ãããããã«ããããè€éã«ãªãã«ã€ããŠã1ã€ã®å Žæããã®ã¿ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããæ©èœã¯éåžžã«å¶éãããŸããã ãã®ããããã©ã°ã远å ã㊠--from å¥ã® Dockerfile ã¹ããŒãžãŸãã¯ãªã¢ãŒãã€ã¡ãŒãžã®ååãæå®ããããšã§ãã®ä»ã® Dockerfile éšåãããã¡ã€ã«ãã³ããŒã§ãããã«ãã¹ããŒãžãã«ãã远å ããŸããã
æ°ããååä»ããã«ã ã³ã³ããã¹ãæ©èœã¯ããã®ãã¿ãŒã³ã®æ¡åŒµæ©èœã§ãã build ã³ãã³ãã®å®è¡æã«è¿œå ã®ãã«ãã³ã³ããã¹ããå®çŸ©ããååãä»ããŠã以åã®ãã«ãã¹ããŒãžãšåãæ¹æ³ã§ã¢ã¯ã»ã¹ Dockerfile ã§ããããã«ãªããŸããã
远å ã®ãã«ã ã³ã³ããã¹ãã¯ãæ°ãã --build-context [name]=[value] ãã©ã°ã䜿çšããŠå®çŸ©ã§ããŸãã ã㌠ã³ã³ããŒãã³ãã¯ãã«ã ã³ã³ããã¹ãã®ååãå®çŸ©ããå€ã¯æ¬¡ã®ããã«ãªããŸãã
- ããŒã«ã«ãã£ã¬ã¯ã㪠â äŸ:
--build-context project2=../path/to/project2/src - Git ãªããžã㪠â äŸãã°
--build-context qemu-src=https://github.com/qemu/qemu.git - ã¿ãŒã«ããŒã«ãžã® HTTP URL â äŸãã°
--build-context src=https://example.org/releases/src.tar - Docker ã€ã¡ãŒãž â ãã¬ãã£ãã¯ã¹ã䜿çšããŠ
docker-image://å®çŸ©ããŸãã--build-context alpine=docker-image://alpine:3.15
Â
Dockerfile åŽé¢ã§ã¯ã"from" ãã©ã¡ãŒã¿ãŒãåãå
¥ãããã¹ãŠã®ã³ãã³ãã§ãã«ã ã³ã³ããã¹ããåç
§ã§ããŸãããããã©ã®ããã«èŠãããã§ã:
# syntax=docker/dockerfile:1.4 FROM [name] COPY --from=[name] ... RUN --mount=from=[name] âŠ
Â
ã®å€ã¯ [name] ãæ¬¡ã®åªå
é äœãšäžèŽããŸãã
- ã§å®çŸ©ãããååä»ããã«ã ã³ã³ããã¹ã
--build-context [name]=.. - å
éšã§
AS [name]å®çŸ©ãããã¹ããŒãžDockerfile - ã³ã³ãã㌠ã¬ãžã¹ããªå
ã®ãªã¢ãŒã ã€ã¡ãŒãž
[name]
Â
ãã©ã°ãèšå®ãããŠããªãå Žå --from ããã¡ã€ã«ã¯ã¡ã€ã³ã®ãã«ãã³ã³ããã¹ãããèªã¿èŸŒãŸããŸãã
äŸ #1: ç»åã®åºå®
ãã«ã ã³ã³ããã¹ãã䜿çšããŠãã§äœ¿çšããã Dockerfile ã€ã¡ãŒãžãç¹å®ã®ããŒãžã§ã³ã«ãã³çãããæ¹æ³ã®äŸããå§ããŸãããã
ããã¯ãããŸããŸãªå Žåã«åœ¹ç«ã¡ãŸãã ããšãã°ã æ°ãããã«ãæ å ±æ©èœ ãã¹ãŠã®ãã«ã ãœãŒã¹ããã£ããã£ããã€ã¡ãŒãž ã¿ã°ãæŽæ°ãããŠããå Žåã§ãã以åã®ãã«ããšåãäŸåé¢ä¿ã§ãã«ããå®è¡ããŸãã
docker buildx imagetools inspect --format '{{json .BuildInfo}}' moby/buildkit
"sources": [
{
"type": "docker-image",
"ref": "docker.io/library/alpine:3.15",
"pin": "sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300"
},
Â
docker buildx build --build-context alpine:3.15=docker-image://alpine:3.15@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300 .
ããªãã Dockerfile 䜿çšãã alpine:3.15ãšãã ã¬ãžã¹ããªå
ã®æ°ããããŒãžã§ã³ã§æŽæ°ãããå Žåã§ããæ°ãããã«ãã§ã¯ã以åã®ãã«ããšãŸã£ããåãã€ã¡ãŒãžã䜿çšãããŸãã
å¥ã®äŸãšããŠãã€ã¡ãŒãžã®ãããã°ãŸãã¯éçºã®ããã«ãå¥ã®ã€ã¡ãŒãžãŸãã¯å¥ã®ããŒãžã§ã³ã詊ãããšãã§ããŸãã äžè¬çãªãã¿ãŒã³ã¯ãã€ã¡ãŒãžããŸã ãªãªãŒã¹ããŠãããããã¹ã ã¬ãžã¹ããªãŸãã¯ã¹ããŒãžã³ã°ç°å¢ã«ã®ã¿ååšããå Žåã§ãã ã¢ããªããã«ãããŠã¹ããŒãžã³ã° ãªããžããªã«ããã·ã¥ããããéåžžã¯ãªãªãŒã¹ ã€ã¡ãŒãžã䜿çšããä»ã®ãã«ãã§äœ¿çšããããšããŸãã
Â
docker buildx build --build-context myorg/myapp=docker-image://staging.myorg.com/registry/myapp .
åã®äŸã¯ãã€ã¡ãŒãžã®ãšã€ãªã¢ã¹ãäœæããæ¹æ³ãšèããããšãã§ããŸãã
äŸ #2: è€æ°ã®ãããžã§ã¯ã
ãããããååä»ãã³ã³ããã¹ãæ©èœã§æãèŠæ±ããããŠãŒã¹ã±ãŒã¹ã¯ãè€æ°ã®ããŒã«ã«ãœãŒã¹ãã£ã¬ã¯ããªã䜿çšããå¯èœæ§ã§ãã
ãããžã§ã¯ãã«äžç·ã«ãã«ãããå¿
èŠãããè€æ°ã®ã³ã³ããŒãã³ããå«ãŸããŠããå Žåããã¹ãŠã 1 ã€ã®ãã£ã¬ã¯ããªã«å«ããå¿
èŠããã 1 ã€ã®ãã«ã ã³ã³ããã¹ãã§ããããèªã¿èŸŒãã®ã¯é£ããå ŽåããããŸãã ããŸããŸãªåé¡ããããŸã:ãã¹ãŠã®ã³ã³ããŒãã³ãã¯ãã«ãã¹ã§ã¢ã¯ã»ã¹ããå¿
èŠãããã1ã€ã ã .dockerignore æã€ããšãã§ããŸã ãã¡ã€ã«ããŸãã¯åã³ã³ããŒãã³ãã«ç¬èªã® Dockerfile.
ãããžã§ã¯ãã®ã¬ã€ã¢ãŠããæ¬¡ã®å Žå:
ãããžã§ã¯ã âââ ã¢ããª1 â âââ .dockerignoreâ âââ åºå ž âââ ã¢ããª2 â âââ .dockerignoreâ âââ åºå ž âââ ããã«ãŒãã¡ã€ã«
...ãã®ããã«ãŒãã¡ã€ã«ã§:
#syntax=docker/dockerfile:1.4 FROM ⊠AS build1 COPY âfrom=app1 . /src FROM ⊠AS build2 COPY âfrom=app2 . /src FROM ⊠COPY âfrom=build1 /out/app1 /bin/ COPY âfrom=build2 /out/app2 /bin/
...ã䜿çšããŠãã«ã docker buildx build âbuild-context app1=app1/src âbuild-context app2=app2/src .ãåŒã³åºãããšãã§ããŸããäž¡æ¹ã®ãœãŒã¹ ãã£ã¬ã¯ããªã¯åå¥ã« Dockerfile ã«å
¬éãããããããã®ååã§ã¢ã¯ã»ã¹ã§ããŸãã
ããã«ãããã¡ã€ã³ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã®å€éšã«ãããã¡ã€ã«ã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã éåžžã ã®äžã«ãã Dockerfileãšãã¯ãã»ãã¥ãªãã£äžã®çç±ããã ../ 芪ã»ã¬ã¯ã¿ãŒã䜿çšããŠãã«ãã³ã³ããã¹ãå€ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã ãã ãããã¹ãŠã®ãã«ã ã³ã³ããã¹ãã¯ã¯ã©ã€ã¢ã³ãããçŽæ¥æž¡ãããããããã®å¶éãåé¿ããããã«äœ¿çšã§ããŸã --build-context othersource=../../path/to/other/project ã
äŸ #3: ãªã¢ãŒãäŸåé¢ä¿ãããŒã«ã«äŸåé¢ä¿ã§ãªãŒããŒã©ã€ããã
è€æ°ã®ãœãŒã¹ ã³ã³ããã¹ãããã«ãã«å ¬éããå Žåãåã®äŸã®ããã«ããããžã§ã¯ããåžžã«è€æ°ã®ããŒã«ã« ãã£ã¬ã¯ããªã«äŸåããå ŽåããããŸãã ãã ããäŸåé¢ä¿ãããã©ã«ãã§ãªã¢ãŒããœãŒã¹ããããŒããã远å ã®ãããã°ãè¡ãå Žåã¯ããŒã«ã«ãœãŒã¹ã«çœ®ãæãããªãã·ã§ã³ãæ®ãããå ŽåããããŸãã
äŸãšããŠãã¢ããªããã«ãã¹ããŒãž ãã«ãã䜿çšããŠãœãŒã¹ ã³ãŒããããã«ãããå¥ã®ãããžã§ã¯ãã«äŸåããäžè¬çãªãã¿ãŒã³ãèŠãŠã¿ãŸãããã
äœãã®ãããªãã®:
FROM golang AS helper RUN apk add git WORKDIR /src ARG HELPERAPP_VERSION=1.0 RUN git clone https://github.com/someorg/helperapp.git && cd helperapp && git checkout $HELPERAPP_VERSION WORKDIR /src/helperapp RUN go build -o /out/helperapp . FROM alpine COPY âlink âfrom=helper /out/helperapp /bin COPY âlink âfrom=build /out/myapp /bin
Â
ããã¯éåžžã«ããŸãæ©èœããŸãã ãã«ããå®è¡ãããšã helperapp ã¯ãœãŒã¹ ãªããžããªããçŽæ¥ãã«ããããã¢ããªã®ãã€ããªã®æšªã«ã³ããŒãããŸãã å¥ã®ããŒãžã§ã³ã䜿çšããå¿
èŠãããå Žåã¯ãbuild åŒæ°ã䜿çšã㊠HELPERAPP_VERSION å¥ã®å€ãæå®ã§ããŸãã
ããããã¢ããªã±ãŒã·ã§ã³ãéçºããŠããŠããã°ãçºèŠãããšããŸãããã ãã°ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã«ããã®ãããã«ããŒã¢ããªã«ããã®ãã¯ããããããŸããã ã³ãŒãã«ããŒã«ã«ãªå€æŽãå ããŠã helperapp äœãèµ·ãã£ãŠããã®ããåæããå¿
èŠããããŸãã åé¡ã¯ãçŸåšã®ã³ãŒãã§ã¯ãæåã« Dockerfile倿ŽãGithubã«ããã·ã¥ããŠã. ã³ãŒãã倿Žãããã³ã«ãããè¡ãã®ã¯éåžžã«èŠçã§ãã
代ããã«ãåã®ã³ãŒããæ¬¡ã®ããã«å€æŽãããã©ãããæ€èšããŠãã ããã
FROM alpine AS helper-clone RUN apk add git WORKDIR /src ARG HELPERAPP_VERSION=1.0 RUN git clone https://github.com/someorg/helperapp.git && cd helperapp && git checkout $HELPERAPP_VERSION FROM scratch AS helper-src COPY âfrom=helper-clone /src/helperapp / FROM golang:alpine AS helper WORKDIR helperapp RUN âmount=target=.,from=helper-src go build -o /out/helperapp . FROM alpine COPY âlink âfrom=helper /out/helperapp /bin COPY âlink âfrom=build /out/myapp /bin
Â
ããã©ã«ãã§ã¯ããã㯠Dockerfile åã®ãã®ãšãŸã£ããåãããã«åäœããGitHubããã¯ããŒã³ãäœæããŠãœãŒã¹ã³ãŒããååŸããŸãã ãããã ã® helperapp ãœãŒã¹ã³ãŒããå«ãå¥ã®ã¹ããŒãž helper-srcã远å ãããããå¿
èŠã«å¿ããŠãæ°ããååä»ãã³ã³ããã¹ãæ©èœã䜿çšããŠããŒã«ã«ãœãŒã¹ãã£ã¬ã¯ããªã§ãªãŒããŒã©ã€ãã§ããŸãã
docker buildx build âbuild-context helper-src=../ãã¹/å®å
/ãã€/ããŒã«ã«/ãã«ããŒ/ãã§ãã¯ã¢ãŠãã

ããã§ãåå¥ã®Dockerfileã䜿çšããã«ããŸãã¯ãã¹ãŠã®ãœãŒã¹ã³ãŒããåããã£ã¬ã¯ããªã«ç§»åããããšãªãããã¹ãŠã®ããŒã«ã«ãããããã¹ãã§ããŸãã
buildx ãã€ã¯ã®ååä»ãã³ã³ããã¹ã
'build' ã³ãã³ãã«å ããŠã'docker buildx' ã«ã¯ 'bake' ãšããã³ãã³ãããããŸãã Bake ã¯ããã«ã ã³ãã³ãã®ãã©ã°ã®é·ããªã¹ããæ¯åå ¥åãã代ããã«ããã«ãæ§æããã¡ã€ã«ã«å®çŸ©ã§ããé«ã¬ãã«ã®ãã«ã ã³ãã³ãã§ãã
ããã«ãå€ãã®ãã«ããäžç·ã«å®è¡ãããã倿°ãå®çŸ©ããããåå¥ã®ãã«ãæ§æéã§å®çŸ©ãå ±æãããããããšãã§ããŸãã JSONãHCLãããã³ Docker Compose YAML ãã¡ã€ã«ã®ãã«ãæ§æãåãå ¥ããŸãã ããªãã¯ããã«ã€ããŠãã£ãšèªãããšãã§ããŸã ãã«ã x ã®ããã¥ã¡ã³ã.
ãŸããååä»ãã³ã³ããã¹ãã®ãµããŒãã bakeã«è¿œå ããŸããã ããã¯ãè€æ°ã®ãã«ãã³ã³ããã¹ãã«äŸåãã ãèšè¿°ãã Dockerfile ãšããã«ãã³ãã³ããåŒã³åºããã³ã«ãããã®å€ã flag ã§ --build-context æž¡ãå¿
èŠãããããšãå¿ããå¯èœæ§ãããããã䟿å©ã§ãã
bake ã䜿çšãããšãã¿ãŒã²ããå®çŸ©ãå®çŸ©ã§ããŸãã äŸãã°ïŒ
hcl
target âbinaryâ {
contexts = {
app1 = âapp1/srcâ
app2 = âapp2/srcâ
}
}
Â
æ¯åæ£ãããã¹ã§ãã©ã°ã䜿çšããããš --build-context ãèŠããŠãã代ããã«ãåŒã³åºã docker buildx bake binary ã ãã§ããã«ããæ£ããæ§æã§å®è¡ãããŸãã ãã¡ãããããè€éãªã±ãŒã¹ã§ã¯ããããã®ãã£ãŒã«ãã§Bake倿°ãªã©ã䜿çšããããšãã§ããŸãã
ãã®ãã¿ãŒã³ã䜿çšããŠãã¹ããŒãžã³ã° ãªããžããªå ã®ã€ã¡ãŒãžããããã°ãŸãã¯ãã¹ãããç®çã§ç¹å¥ãªãã€ã¯ ã¿ãŒã²ãããäœæããããšãã§ããŸãã
hcl
target âmyappâ {
âŠ
}
target âmyapp-stageâ {
inherits = [âmyappâ]
contexts = {
helperapp = âdocker-image://staging.myorg.com/registry/myappâ
}
}
ãã®ãã㪠Bake ãã¡ã€ã«ã䜿çšãããšãã¿ãŒã²ããã«å¯Ÿã㊠myapp å®çŸ©ãããæ£ç¢ºãªæ§æã§ã¢ããªããã«ãããããã«åŒã³åºã docker buildx bake myapp-stage ããšãã§ããŸããããã«ãã§ã€ã¡ãŒãžã䜿çšããŠããå Žå㯠helperapp ã ã«æžã蟌ãŸã DockerfileããªãªãŒã¹ãªããžããªã§ã¯ãªããã¹ããŒãžã³ã°ãªããžããªããèªã¿èŸŒãŸããŸãã
ãã€ã¯ã¿ãŒã²ããã®ãªã³ã¯ã«ãããã«ããã€ãã©ã€ã³ã®äœæ
ç»åãGitãURLãããã³ããŒã«ã«ãã£ã¬ã¯ããªã«å ããŠãBake ãã¡ã€ã«ã¯ååä»ãã³ã³ããã¹ããšããŠäœ¿çšã§ããå¥ã®å®çŸ©ããµããŒãããŠããŸãã ååä»ãã³ã³ããã¹ãã®ãœãŒã¹ããBake ãã¡ã€ã«å ã®å¥ã®ãã«ãã¿ãŒã²ãããæãããã«èšå®ã§ããŸãã ãã®ããã«ããŠãçžäºã«äŸåããè€æ°ã® Dockerfile ãããã«ãããã§ãŒã³ãã1 åã®ã³ãã³ãåŒã³åºãã§ãã«ãã§ããŸãã
2ã€ã®ããã«ãŒãã¡ã€ã«ããããšããŸãã
# base.Dockerfile FROM alpine âŠ
# Dockerfile FROM baseapp ...
Â
éåžžã¯ãæåã«ãã«ã base.DockerfileããŠããã¬ãžã¹ããªã«ããã·ã¥ããããDocker ã€ã¡ãŒãž ã¹ãã¢ã«æ®ããŸãã æ¬¡ã«ãååã§ã€ã¡ãŒãžãèªã¿èŸŒã 2 çªç®ã® Dockerfile ãã«ããè¡ããŸãã
ãã®ã¢ãããŒãã®åé¡ã¯ãDocker ã€ã¡ãŒãž ã¹ãã¢ã䜿çšããå ŽåãçŸåšãã«ããã©ãããã©ãŒã ã®ããŒã«ã« ã€ã¡ãŒãžããµããŒãããŠããªãããšã§ãã å€éšã¬ãžã¹ããªã䜿çšããããšãå¿ ããã䟿å©ã§ãããšã¯éãããã©ã¡ãã®å Žåããå€éšã®å€æŽã«ãã£ãŠ 2 ã€ã®ãã«ãã®éã«åºæ¬ã€ã¡ãŒãžãæŽæ°ããã2 çªç®ã®ãã«ãã§ééã£ãã€ã¡ãŒãžã䜿çšãããå¯èœæ§ããããŸãã ãŸãããã«ã ã³ãã³ãã 2 åå®è¡ããæåã§åæããå¿ èŠããããŸãã
代ããã«ããã¬ãã£ãã¯ã¹ã§ target: å®çŸ©ããããã«ãã³ã³ããã¹ãã䜿çšã㊠Bake ãã¡ã€ã«ãå®çŸ©ã§ããŸãã
target âbaseâ {
dockerfile = âbase.Dockerfileâ
platforms = [âlinux/amd64â, âlinux/arm64â]
}
target âmyappâ {
contexts = {
baseapp = âtarget:baseâ
}
platforms = [âlinux/amd64â, âlinux/arm64â]
}
Â
ããã§ãå®è¡ docker buildx bake myapp ããã ãã§ã¢ããªããã«ãããŠäž¡æ¹ã® Dockerfile ããã«ãããå¿
èŠã«å¿ããŠãªã³ã¯ã§ããŸãã åºæ¬ã€ã¡ãŒãžãšã¢ããªã®äž¡æ¹ãäžç·ã«ãã«ãããå Žå㯠docker buildx bake myapp baseã. ãããã®ã¿ãŒã²ããã¯äž¡æ¹ãšããã«ããã©ãããã©ãŒã ãšããŠå®çŸ©ãããŠãããBuildxã¯å¯Ÿå¿ããåäžãã©ãããã©ãŒã subimages ãçžäºã«ãªã³ã¯ããŸãã

ãããã®æ¡ä»¶ã§ã¯ãåžžã«æåã«ãã©ã¡ãŒã¿ãŒã䜿çšã㊠--target ãã«ãã¹ããŒãžãã«ãã䜿çšããããšãæ€èšããå¿
èŠãããããšã«æ³šæããŠãã ããã èªå·±å®çµåã® Dockerfiles ã䜿çšãããšããã«ãã§è¿œå ã®ãã©ã¡ãŒã¿ãŒãæž¡ãå¿
èŠããªããããããç°¡åãªãœãªã¥ãŒã·ã§ã³ã§ãã ãã®ãã¿ãŒã³ã¯ãDockerfile ãçµã¿åãããããšãã§ãããããããåé¢ããŠããå¿
èŠãããå Žåã«äœ¿çšããå¿
èŠããããŸãã
ã§æ°ãããã«ãã³ã³ããã¹ãæ©èœã確èªããŠãã ãã Docker Buildx v0.8 ãªãªãŒã¹ãææ°ã® Docker ãã¹ã¯ãããã«å«ãŸããŠããŸãã