Dockerfile ãªãã¡ã¬ã³ã¹Â¶
Docker 㯠Dockerfile ããåœä»€ãèªã¿èŸŒã¿ãèªåçã«ã€ã¡ãŒãžããã«ãã§ããŸãã Dockerfile ã¯ããã¹ããã¡ã€ã«ã§ãããã€ã¡ãŒãžãäœãäžããããã«å®è¡ããã³ãã³ãã©ã€ã³åœä»€ãããã¹ãŠãã®ãã¡ã€ã«ã«å«ããããŸãã docker build ãå®è¡ãããšãé æ¬¡ã³ãã³ãã©ã€ã³åœä»€ãèªååããåŠçãè¡ãããã«ãçµæãšãªãã€ã¡ãŒãžãåŸãããŸãã
ãã®ããŒãžã§ã¯ã Dockerfile ã§å©çšå¯èœãªã³ãã³ãã説æããŸãããã®ããŒãžãèªã¿çµãããã Dockerfile ã® ãã¹ããã©ã¯ãã£ã¹ ãéããçè§£ãéèŠããã¬ã€ããã芧ãã ããã
äœ¿çšæ³Â¶
docker build ã³ãã³ãã¯ã Dockerfile ãš PATH ïŒå ŽæïŒãŸã㯠URL ã«ãããã¡ã€ã«äžåŒã§ãã PATH ã¯ããŒã«ã«ã»ãã¡ã€ã«ã·ã¹ãã äžã®ãã£ã¬ã¯ããªã§ãã URL 㯠Git ãªããžããªã®å Žæã§ãã
PATH ã«ã¯ãã¹ãŠã®ãµããã£ã¬ã¯ããªãå«ãŸãã URL ã«ã¯ãªããžããªãšãµãã¢ãžã¥ãŒã«ãå«ãŸããŸãã以äžã®äŸã«ãããæ§ç¯ã³ãã³ãã¯ãçŸåšã®ãã£ã¬ã¯ããªïŒ . ïŒãæ§ç¯ã³ã³ããã¹ããšããŠäœ¿çšããŸãã
$ docker build .
Sending build context to Docker daemon 6.51 MB
...
æ§ç¯ã¯ Docker ããŒã¢ã³ãå®è¡ãããã®ã§ããã CLI ã«ãããã®ã§ã¯ãããŸãããæ§ç¯åŠçã§ãŸãè¡ãããã®ã¯ãã³ã³ããã¹ãå šäœãïŒååž°çã«ïŒããŒã¢ã³ã«éä¿¡ããŸãããããŠãã®å Žåãã³ã³ããã¹ããšããŠç©ºã®ãã£ã¬ã¯ããªãçšæããããã« Dockerfile ã眮ãã®ããã¹ãã§ãããã®ãã£ã¬ã¯ããªãžã¯ãDockerfile ã®æ§ç¯ã«å¿ èŠãªãã¡ã€ã«ã®ã¿è¿œå ããŸãã
èŠå
ã«ãŒãã»ãã£ã¬ã¯ã㪠/ ãæ§ç¯ã³ã³ããã¹ãã® PATH ãšããŠæå®ããªãã§ãã ãããæ§ç¯æãããŒããã£ã¹ã¯ã®å
容ãã¹ãŠã Docker ããŒã¢ã³ã«è»¢éããŠããŸãããã§ãã
æ§ç¯ã³ã³ããã¹ãå
ã«ãããã¡ã€ã«ã䜿ãå Žåã COPY åœä»€ãªã©ã Dockerfile ã®åœä»€ã§æå®ããããã¡ã€ã«ãåç
§ããŸããæ§ç¯æã®åŠçæ§èœãäžããã«ã¯ãã³ã³ããã¹ãã»ãã£ã¬ã¯ããªã« .dockerignore ãã¡ã€ã«ã远å ããäžèŠãªãã¡ã€ã«ããã£ã¬ã¯ããªãé€å€ããŸãã .dockerignore ãã¡ã€ã«ãäœæãã詳现ã¯ããã®ããŒãžå
ã® ããã¥ã¡ã³ã ãåç
§ãã ããã
ããšããšã Dockerfile 㯠Dockerfile ãšåŒã°ããã³ã³ããã¹ãã®ã«ãŒãïŒå¯Ÿè±¡ãã£ã¬ã¯ããªã®ãããïŒã«çœ®ãããŸããã docker build ã§ -f ãã©ã°ã䜿ãã°ãDockerfile ããã¡ã€ã«ã·ã¹ãã äžã®ã©ãã«ãã£ãŠãæå®ã§ããŸãã
$ docker build -f /path/to/a/Dockerfile .
æ§ç¯ã®æåæãæ°ããã€ã¡ãŒãžãä¿åãã
$ docker build -t shykes/myapp .
æ§ç¯åŸãè€æ°ã®ãªããžããªã«å¯ŸããŠã€ã¡ãŒãžãã¿ã°ä»ãããã«ã¯ã build ã³ãã³ãã®å®è¡æãè€æ°ã® -t ãã©ã¡ãŒã¿ã远å ããŸãã
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
Docker ããŒã¢ã³ã¯ Dockerfile å
ã«æžãããåœä»€ãå®è¡ããåã«ãäºåã« Dockerfile ãæ€èšŒããæ§æãééã£ãŠããå Žåã¯ãšã©ãŒãè¿ããŸãã
$ docker build -t test/myapp .
[+] Building 0.3s (2/2) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 60B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
error: failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition:
dockerfile parse error line 2: unknown instruction: RUNCMD
Docker ããŒã¢ã³ã¯ Dockerfile å
ã®åœä»€ã 1 ã€ãã€å®è¡ããå¿
èŠãªå Žåã«ã¯ãã«ãã€ã¡ãŒãžå
ã«ãã®åŠççµæã
ååœä»€ã¯åå¥ã«å®è¡ãããéœåºŠãæ°ããã€ã¡ãŒãžãçæãããŸãã®ã§ã泚æãã ããããããã£ãŠãããšãã° RUN cd /tmp ãšããåœä»€ããã£ãŠãããã®æ¬¡ã®åœä»€ã«ã¯äœã圱é¿ãäžããŸããã
Docker ã¯å¯èœãªéã docker build ã®åŠçãèããé«éã«ããŸãããã®å Žåã¯ã³ã³ãœãŒã«åºåã« CACHED ãšããã¡ãã»ãŒãžãåºãŸããïŒè©³çްã«ã€ããŠã¯ã Dockerfile ã®ãã¹ããã©ã¯ãã£ã¹ã¬ã€ã ãåç
§ãã ãããïŒ
$ docker build -t svendowideit/ambassador .
[+] Building 0.7s (6/6) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 286B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/alpine:3.2 0.4s
=> CACHED [1/2] FROM docker.io/library/alpine:3.2@sha256:e9a2035f9d0d7ce 0.0s
=> CACHED [2/2] RUN apk add --no-cache socat 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:1affb80ca37018ac12067fa2af38cc5bcc2a8f09963de 0.0s
=> => naming to docker.io/svendowideit/ambassador 0.0s
æ§ç¯ãã£ãã·ã¥ãšã¯ãããã©ã«ãã§ã¯ãæ§ç¯ãããã·ã³äžã§ä»¥åã«æ§ç¯ãããçµæã«åºã¥ããŸãã --cache-from ãªãã·ã§ã³ã®æå®ã«ãããã€ã¡ãŒãžã»ã¬ãžã¹ããªãéããŠé
åžãããæ§ç¯ãã£ãã·ã¥ã䜿ããŸãã docker build ã³ãã³ããªãã¡ã¬ã³ã¹ã® å€éšã®ãã£ãã·ã¥ããœãŒã¹ãšããŠæå® ã»ã¯ã·ã§ã³ãã芧ãã ããã
æ§ç¯ãçµããã°ã docker scan ã§ ã€ã¡ãŒãžãæ€æ» ãããã Docker Hub ã«ã€ã¡ãŒãžãéä¿¡ ãããã§ããŸãã
BuildKit ¶
ããŒãžã§ã³ 18.09 ãããDocker 㯠moby/buildkit ãããžã§ã¯ãã«ãã£ãŠæäŸããããæ°ããæ§ç¯çšããã¯ãšã³ãããµããŒãããŠããŸããå€ãå®è£ ã«æ¯ã¹ãBuildKit ããã¯ãšã³ãã¯å€ãã®å©ç¹ããããŸããããšãã°ã BuildKit ã¯æ¬¡ã®ããšãã§ããŸãã
䜿çšããŠããªã æ§ç¯ã¹ããŒãž ã®æ€åºãšã¹ããã
ç¬ç«ããŠããæ§ç¯ã¹ããŒãžã
äžŠåæ§ç¯ æ§ç¯ã³ã³ããã¹ããšæ§ç¯ã®éã§ã¯ã倿Žã®ãã£ããã¡ã€ã«ã®ã¿è»¢é
æ§ç¯ã³ã³ããã¹ãå ã§ãæªäœ¿çšãã¡ã€ã«ã®æ€åºãšã転éã®ã¹ããã
å€ãã®æ°æ©èœããã
æ¡åŒµ Dockerfile å®è£ ã䜿çšä»ã® API ïŒäžéã€ã¡ãŒãžãšã³ã³ããïŒã«ããå¯äœçšãåé¿
èªåæŽç ã®ããã«ãæ§ç¯ãã£ãã·ã¥ãåªå 床ä»ã
BuildKit ããã¯ãšã³ãã䜿ãã«ã¯ã docker build ãå®è¡ããåã«ãCLI äžã§ç°å¢å€æ° DOCKER_BUILDKIT=1 ãèšå®ããå¿
èŠããããŸãã
BuildKit ã䜿ã£ãæ§ç¯æã«æå¹ãšãªããæ¡åŒµ Dockerfile å®è£ ã«ã€ããŠã®è©³çްãç¥ãã«ã¯ã BuildKit ãªããžããªã«ããããã¥ã¡ã³ããåç §ãã ãã ã
æžåŒÂ¶
Dockerfile ã®æžåŒã¯æ¬¡ã®éãã§ãã
# ã³ã¡ã³ã
åœä»€ åŒæ°
Docker 㯠Dockerfile å
ã®åœä»€ãèšè¿°é ã«å®è¡ããŸãã Dockerfile ã¯å¿
ã FROM åœä»€ã§å§ããªããã°ãªããŸããã ãã ãã ããŒãµã»ãã£ã¬ã¯ãã£ã ã ã³ã¡ã³ã ãå
šäœã«é©çšããã ARG ã®åŸã«ãªãå ŽåããããŸãã FROM åœä»€ã§æå®ããã®ã¯ãæ§ç¯æã«å
ãšãªã 芪ã€ã¡ãŒãž ã§ãã Dockerfile ã®äžã§ã FROM è¡ã® ARG åœä»€ã¯ã FROM ãããåã«èšè¿°ã§ããå¯äžã®åœä»€ã§ãã
Docker 㯠# ã§å§ãŸãè¡ãã³ã¡ã³ããšããŠæ±ããŸãããã ãã ããŒãµã»ãã£ã¬ã¯ãã£ã ã¯äŸå€ã§ãããŸããè¡ã®éäžã«ãã # ã¯åãªãåŒæ°ãšããŠæ±ããŸããæ¬¡ã®ãããªèšè¿°ãã§ããŸãã
# ã³ã¡ã³ã
RUN echo 'we are running some # of cool things'
Dockerfile ã§åœä»€ãå®è¡ããåã«ãã³ã¡ã³ãè¡ã¯åé€ãããŸããã€ãŸãã以äžã®äŸã«ããã³ã¡ã³ã㯠echo ã³ãã³ãã®ã·ã§ã«å®è¡ã§ã¯æ±ãããã以äžäž¡æ¹ã®äŸã¯åããã®ã§ãã
RUN echo hello \
# ã³ã¡ã³ã
world
RUN echo hello \
world
ãªããã³ã¡ã³ãäžã§ã¯
泚é
空çœã«ã€ããŠã®æ³šæ
åŸæ¹äºææ§ã®ãããã³ã¡ã³ãïŒ # ïŒãšïŒ RUN ã®ãããªïŒåœä»€ãããåã®ç©ºçœãç¡èŠããŸããããå§ãããŸããã以äžã®ãããªäŸã§ã¯ãå
é ã®ç©ºçœã¯ä¿æãããªããããã©ã¡ããåããã®ã§ãã
# ããã¯ã³ã¡ã³ãè¡ã§ã
RUN echo hello
RUN echo world
# this is a comment-line
RUN echo hello
RUN echo world
ãã ãæ³šæãå¿
èŠãªã®ã¯ã以äžã® RUN åœä»€ã®ããã«ãåœä»€ã«å¯ŸããåŒæ°ã®ç©ºçœã¯ä¿æãããŸãããã®ããã以äžã®äŸã§ã¯ãå
é ã«ç©ºçœãæå®ããéãããã hello worldãã衚瀺ããŸãã
RUN echo "\
hello\
world"
ããŒãµã»ãã£ã¬ã¯ãã£ã ¶
Dockerfile ã§æå®ãããšã以éã®è¡ã§ã®æåã«åœ±é¿ãäžããŸããããŒãµã»ãã£ã¬ã¯ãã£ãã¯æ§ç¯æã«ã¬ã€ã€ã远å ããªããããæ§ç¯ã¹ãããã§è¡šç€ºãããŸãããããŒãµã»ãã£ã¬ã¯ãã£ã㯠# ãã£ã¬ã¯ãã£ãïŒåœä»€ã®ååïŒ=å€ ãšãã圢åŒã®ãç¹å¥ãªã¿ã€ãã®ã³ã¡ã³ããšããŠæžããŸãã1ã€ã®ãã£ã¬ã¯ãã£ãïŒåœä»€ïŒã¯äžåºŠãã䜿ããŸããã
ã³ã¡ã³ãã空è¡ãæ§ç¯åœä»€ãåŠçãããšãDocker ã¯ããŒãµã»ãã£ã¬ã¯ãã£ããæ¢ããªããªããŸãããã®ããããããŒãµã»ãã£ã¬ã¯ãã£ãã®èšè¿°ã¯ã³ã¡ã³ããšããŠæ±ãããããŒãµã»ãã£ã¬ã¯ãã£ããã©ããã¯ç¢ºèªããŸããããã®ããããã¹ãŠã®ããŒãµã»ãã£ã¬ã¯ãã£ã㯠Dockerfile ã®äžçªäžã«æžãå¿
èŠããããŸãã
ããŒãµã»ãã£ã¬ã¯ãã£ãã¯å€§æåãšå°æåãåºå¥ããŸãããããããå°æåã䜿ãã®ãæ
£äŸã§ããä»ã«ãæ
£äŸãšããŠãããŒãµã»ãã£ã¬ã¯ãã£ãã®æ¬¡è¡ã¯ç©ºçœã«ããŸããããŒãµã»ãã£ã¬ã¯ãã£ãå
ã§ã¯ã
ãããã®èŠåããããããæ¬¡ã®äŸã¯ã©ããç¡å¹ã§ãã
ïŒããã¯ã¹ã©ãã·ã¥ã䜿ã£ãïŒè¡ã®ç¶ç¶ã¯ã§ããŸããïŒ
# ãã£ã¬ã¯ \
ãã£ã=å€
ïŒãã£ã¬ã¯ãã£ããïŒäºåºŠåºçŸããããç¡å¹ïŒ
# ãã£ã¬ã¯ãã£ã=å€1
# ãã£ã¬ã¯ãã£ã=å€2
FROM ã€ã¡ãŒãžå
æ§ç¯åœä»€ã®åŸã«ïŒããŒãµã»ãã£ã¬ã¯ãã£ããïŒãã£ãŠããã³ã¡ã³ããšããŠæ±ãïŒ
FROM ImageName
# ãã£ã¬ã¯ãã£ã=å€
ã³ã¡ã³ãã®åŸã«ããŒãµã»ãã£ã¬ã¯ãã£ãããã°ãïŒåãªãïŒã³ã¡ã³ããšããŠæ±ãïŒ
# dockerfile ã«ã€ããŠã®èª¬æ
# ãã£ã¬ã¯ãã£ã=å€
FROM ImageName
äžæãªãã£ã¬ã¯ãã£ãã¯èªèã§ããªããããã³ã¡ã³ããšããŠæ±ããããã«ãããŒãµã»ãã£ã¬ã¯ãã£ãã§ã¯ãªãã³ã¡ã³ãã®åŸã«ãã£ã¬ã¯ãã£ãããã£ãŠããïŒåœä»€ãšããŠã§ã¯ãªãïŒã³ã¡ã³ããšããŠæ±ãïŒ
# äžæãªåœä»€=å€
# æ£ããåœä»€=å€
ããŒãµã»ãã£ã¬ã¯ãã£ãã§ã¯ãæ¹è¡ã§ã¯ãªã空çœïŒã¹ããŒã¹ïŒãæžããŸãããã®ããã以äžã®åè¡ã¯ãã¹ãŠåãããã«æ±ãããŸãã ããã§ã以äžã®åè¡ã¯ãã¹ãŠåäžã®ãã®ãšããŠæ±ãããŸãã
#directive=value
# directive =value
# directive= value
# directive = value
# dIrEcTiVe=value
以äžã®ããŒãµã»ãã£ã¬ã¯ãã£ãããµããŒãããŠããŸãã
syntaxescape
syntax¶
# syntax=[ãªã¢ãŒãã»ã€ã¡ãŒãžã»ãªãã¡ã¬ã³ã¹]
äŸïŒ
# syntax=docker/dockerfile:1
# syntax=docker.io/docker/dockerfile:1
# syntax=example.com/user/repo:tag@sha256:abcdef...
ãã®æ©èœã¯ã BuildKit ããã¯ãšã³ããå©çšæã®ã¿äœ¿ããŸãããã®ãããå€ãæ§ç¯ããã¯ãšã³ãã®å©çšæã«ã¯ãç¡èŠãããŸãã
syntax ãã£ã¬ã¯ãã£ãïŒåœä»€ïŒã§ã¯ã察象㮠Dockerfile ãæ§ç¯æã«äœ¿ãã Dockerfile
ã«ã¹ã¿ã Dockerfile å®è£ ã«ãããæ¬¡ã®ããšãå¯èœã«ãªããŸãã
Docker ããŒã¢ã³ãæŽæ°ããªããŠããèªåçã«ãã°ä¿®æ£ããã
ãã¹ãŠã®å©çšè ã確å®ã«åãå®è£ ã䜿ããDockerfile ã§æ§ç¯ãã
Docker ããŒã¢ã³ãæŽæ°ããªããŠããææ°æ©èœã䜿ã
Docker ããŒã¢ã³ã«çµ±ååã®ãæ°æ©èœããµãŒãããŒãã£æ©èœã詊ã
ä»ã® build å®çŸ©ããèªåèªèº«ã§äœæããå®çŸ© ã䜿ã
å ¬åŒãªãªãŒã¹Â¶
stable ãã£ã³ãã«ã¯ ã»ãã³ãã£ãã¯ã»ããŒãžã§ãã³ã° ã«åŸããŸããããšãã°ã
docker/dockerfile:1- ææ°ã®1.x.xãã€ã㌠ããã³ ãããã»ãªãªãŒã¹ãæŽæ°ããç¶ããdocker/dockerfile:1.2- ææ°ã®1.2.xãããã»ãªãªãŒã¹ãæŽæ°ããç¶ããŸããã1.3.0ããŒãžã§ã³ããªãªãŒã¹ããããšæŽæ°åæ¢docker/dockerfile:1.2.1-å€ãããŸãã ïŒæ±ºããŠæŽæ°ããªã
ç§ãã¡ã¯ docker/dockerfile:1 ã®äœ¿çšãæšå¥šããŸããããã¯ãåžžã«ããŒãžã§ã³ 1
1.2 ã 1.2.1 ã®ãããªããŒãžã§ã³ãæå®ãããšããã°ä¿®æ£ãæ°æ©èœãå©çšããã«ã¯ã Dockerfile ãæåã§æŽæ°ããå¿
èŠããããŸããDockerfile ã®å€ãããŒãžã§ã³ã¯ã
labs ãã£ã³ãã«Â¶
ãlabsããã£ã³ãã«ãæäŸããã®ã¯ããŸã stable ãã£ã³ãã«ã§ã¯å©çšã§ããªãã Dockerfileæ©èœã«å¯Ÿããæ©æã¢ã¯ã»ã¹ã§ããLabs ãã£ã³ãã«ã»ã€ã¡ãŒãžã¯ stable ãªãªãŒã¹ãšé£æºããŠããŸããåãããŒãžã§ã³ã« -labs æåãä»ããŸããããšãã°ã
docker/dockerfile:labs- labs ãã£ã³ãã«ã®ææ°ãªãªãŒã¹docker/dockerfile:1-labs- stable ãã£ã³ãã«ã®dockerfile:1ãšåãã§ãlabs æ©èœãæå¹ådocker/dockerfile:1.2-labs- stable ãã£ã³ãã«ã®dockerfile:1.2ãšåãã§ãlabs æ©èœãæå¹ådocker/dockerfile:1.2.1-labs-å€ãããŸãã ïŒæ±ºããŠæŽæ°ããªãã stable ãã£ã³ãã«ã®dockerfile:1.2.1ãšåãã§ãlabs æ©èœãæå¹å
å¿
èŠã«å¿ããŠæé©ãªãã£ã³ãã«ãéžã³ãŸããæ°æ©èœã掻çšãããå Žå㯠labs ãã£ã³ãã«ã䜿ããŸããlabs ãã£ã³ãã«ãæäŸããã€ã¡ãŒãžã¯ãstable ãã£ã³ãã«ã® stable æ©èœã¯ ã»ãã³ãã£ãã¯ã»ããŒãžã§ãã³ã° ã«åŸããŸããããããlabsãæ©èœã¯åŸããŸããããŸããæ°ãããªãªãŒã¹ã¯äžäœäºææ§ããªãå¯èœæ§ããããããããŒãžã§ã³ãåºå®ããããã«ããŒãžã§ã³ã§ã®æå®ããå§ãããŸãã
ãlabsãæ©èœã
escape¶
# escape=\ (ããã¯ã¹ã©ãã·ã¥)
ãŸãã¯
# escape=` (ããã¯ã¯ã©ãŒã)
Dockerfile å
ã§æåã escape åœä»€ã§æå®ããŸããæå®ããªããã°ãããã©ã«ãã®ãšã¹ã±ãŒãæå㯠\ ã§ãã
ãšã¹ã±ãŒãæåã¯ãè¡ã®äžã§æåããšã¹ã±ãŒãããã®ã«äœ¿ãå Žåãšãæ¹è¡ããšã¹ã±ãŒãããïŒæ¹è¡æåãšããŠäœ¿ãïŒå ŽåããããŸããããã«ããã Dockerfile ã®åœä»€ã¯ãè€æ°ã®è¡ã«æžããŸããæ³šæç¹ãšããŠã¯ã Dockerfile ã§ escape ããŒãµã»ãã£ã¬ã¯ãã£ãã®æç¡ã«ãããããã RUN åœä»€ã§ã¯ãšã¹ã±ãŒããããŸããããè¡æ«ã®ã¿ïŒæ¹è¡æåãšããŠïŒäœ¿çšã§ããŸãã
Windows äžã§ã¯ã \ ãããã£ã¬ã¯ããªã»ãã¹ã®åºåãæåã®ããããšã¹ã±ãŒãæåãšããŠã`ã ãæå®ãããšããšãŠã䜿ããããã§ãããã Windows PowerShell äžã§ããã`ãã¯ãšã¹ã±ãŒãæååãšããŠæ±ããŸãã
以äžã«ãããããªãäžèŠãããšåããã¥ãã Windows äžã§ã®å€±æäŸãèããŸãã2è¡ç®ã®è¡æ«ã«ããã2ã€ãã® \ ã¯ã1ã€ãã® \ ã®ãšã¹ã±ãŒã察象ã§ã¯ãªããæ¹è¡ïŒã衚ããšã¹ã±ãŒãæåïŒãšããŠè§£éãããŸããåãããã«ã3è¡ç®ã®è¡æ«ã«ãã \ ããå®éã«ã¯åœä»€ãšããŠåŠçãããæ¹è¡ãšããŠæ±ãããŸããçµæãšããŠããã® Dockerfile ã§ã¯2è¡ç®ãš3è¡ç®ã¯1ã€ã®åœä»€ãšèŠãªãããŸãã
FROM microsoft/nanoserver
COPY testfile.txt c:\\
RUN dir c:\
çµæïŒ
PS E:\myproject> docker build -t cmd .
Sending build context to Docker daemon 3.072 kB
Step 1/2 : FROM microsoft/nanoserver
---> 22738ff49c6d
Step 2/2 : COPY testfile.txt c:\RUN dir c:
GetFileAttributesEx c:RUN: The system cannot find the file specified.
PS E:\myproject>
ããã解決ããæ¹æ³ã®1ã€ã¯ãCOPY åœä»€ãš dir ã®äž¡æ¹ã§ã察象ã«å¯Ÿã㊠/ æåã䜿ããã®ã§ããããã¯ãã¹ãã§ããã Windows äžã®ãã¹ãšããŠã¯èªç¶ã§ã¯ãªããããæ··ä¹±ããŸãããŸããå°ã£ãããšã«ã Windows äžã§ã³ãã³ããã¹ãŠã / ããã¹ã®åºåãæåãšããŠãµããŒãããŠãããããšã©ãŒãçºçããã¡ã§ãã
次㮠Dockerfile 㯠escape ããŒãµã»ãã£ã¬ã¯ãã£ãã®è¿œå ã«ããã Windows äžã®ãã¡ã€ã«ããã¹ãéåžžéãã®æ§æãšããŠæ±ããããã«ãªããŸãïŒè£è¶³èª¬æïŒããã©ã«ãã§ã¯ã \ ããæ¹è¡æåãšããŠæ±ãããŠããŸãããããŠãšã¹ã±ãŒãæåãã`ããšæç€ºãããšãç¹ã«ã \ ãããšã¹ã±ãŒãæåãã©ããèæ
®ããå¿
èŠããªããªãããã¹ã®æå®ãšããŠã C:\ ãã®èšè¿°ããã®ãŸãŸæ±ããããã«ãªããŸãïŒã
# escape=`
FROM microsoft/nanoserver
COPY testfile.txt c:\
RUN dir c:\
çµæïŒ
PS E:\myproject> docker build -t succeeds --no-cache=true .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM microsoft/nanoserver
---> 22738ff49c6d
Step 2/3 : COPY testfile.txt c:\
---> 96655de338de
Removing intermediate container 4db9acbb1682
Step 3/3 : RUN dir c:\
---> Running in a2c157f842f5
Volume in drive C has no label.
Volume Serial Number is 7E6D-E0F7
Directory of c:\
10/05/2016 05:04 PM 1,894 License.txt
10/05/2016 02:22 PM <DIR> Program Files
10/05/2016 02:14 PM <DIR> Program Files (x86)
10/28/2016 11:18 AM 62 testfile.txt
10/28/2016 11:20 AM <DIR> Users
10/28/2016 11:20 AM <DIR> Windows
2 File(s) 1,956 bytes
4 Dir(s) 21,259,096,064 bytes free
---> 01c7f3bef04f
Removing intermediate container a2c157f842f5
Successfully built 01c7f3bef04f
PS E:\myproject>
ç°å¢å€æ°ã®çœ®ãæã¶
ïŒ ENV åœä»€ ã§å®£èšãã ïŒ Dockerfile ã§ç¹å®ã®åœä»€ã«å¯Ÿãã倿°ãšããŠã®äœ¿çšãã§ããŸãããŸãããšã¹ã±ãŒãã䜿ãã°ã倿°ã®ãããªæ§æããåœä»€æã®æååã«å
¥ããããŸãã
Dockerfile å
ã§ã®ç°å¢å€æ°ã¯ã $variable_name ãŸã㯠${variable_name} ãšããŠæžããŸããã©ã¡ããåçã«æ±ãããŸããäžæ¬åŒ§ïŒ { } ïŒãäœ¿ãæžãæ¹ã¯ã ${foo}_bar ã®ããã«ç©ºçœã䜿ããã倿°åã«å²ãåœãŠãïŒããã®å€æ°ïŒãšããŠéåžžã¯äœ¿ããŸãã
${variable_name} ã®æžãæ¹ã¯ã次ã®ãããªïŒå€æ°å±éããããã®ïŒæšæºç bash
${variable:-word}âŠvariableïŒã倿°ããšããŠäœããã®å€ïŒãèšå®ãããŠããã°ãçµæã¯ãã®ïŒå€æ°ãïŒå€ã«ãªããvariableïŒå€æ°ïŒãæå®ãããŠããªããã°ãwordãå€ãšããŠèšå®ãããã${variable:+word}âŠvariableïŒã倿°ããšããŠäœããã®å€ïŒãèšå®ãããŠããã°ãçµæã¯wordãïŒå€æ°ã®ïŒå€ã«ãªãããã以å€ã®å ŽåïŒå€æ°ã®èšå®ããªãå ŽåïŒã¯ç©ºã®æååã«ãªãã
ã©ã¡ãã®äŸã§ããïŒå€æ°ã®äžã«ããïŒ word ã«ã¯ä»»æã®æååãæå®ã§ããŸãããç°å¢å€æ°ã远å ããæååãæå®ã§ããŸãã
倿°ã®åã« \ ã远å ããŠãšã¹ã±ãŒãã§ããŸããããšãã°ã \$foo ã \${foo} ã¯ã $foo ãš ${foo} ãšããæååã«å€æãããŸãã
äŸïŒ # ã®æšªãã倿°å±éããçµæ ïŒïŒ
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
ADD . $FOO # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux
ç°å¢å€æ°ã¯ã Dockerfile å
ã®ä»¥äžã®åœä»€ã§ãµããŒããããŠããŸãã
ADDCOPYENVEXPOSEFROMLABELSTOPSIGNALUSERVOLUMEWORKDIRONBUILDïŒä»¥äžã®åœä»€ãšã®çµã¿åããã§ãµããŒããããŸãïŒ
ç°å¢å€æ°ã眮ãæãã§ã¯ãååœä»€ïŒã®è¡ïŒå šäœãåŠçããéã¯ãå倿°ã¯åãå€ã§ããããªãã¡ããã®äŸã§ã¯
ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc
çµæã def ã®å€ã¯ hello ã§ããã bye ã§ã¯ãããŸããããããã ghi ã®å€ã¯ bye ã§ãããªããªããïŒå€æ°ïŒ abc ã« bye ãæå®ããåœä»€ã®è¡ãšããã® ghi ã®åœä»€ã®è¡ãéãããã§ããïŒè£è¶³èª¬æïŒ ENV abc=bye def=$abc ã®åœä»€æã®åŠçãçµãããŸã§ã¯ $abc 㯠hello ã®ãŸãŸããã®åœä»€ã®åŠçãçµãããšã $abc 㯠bye ã«ãªãããã®ãããæ¬¡ã®åœä»€å ghi=$abc ã§ã $abc ã®å€ bye ã倿° ghi ã«å
¥ã ïŒ
.dockerignore ãã¡ã€ã«Â¶
Docker CLI ã .dockerignore ãšããååã®ãã¡ã€ã«ãæ¢ããŸãããã®ãã¡ã€ã«ãååšããå ŽåãCLI ã¯ãã¡ã€ã«å
ã§æžããããã¿ãŒã³ã«äžèŽãããã¡ã€ã«ããã£ã¬ã¯ããªããã³ã³ãã¯ã¹ãããé€å€ããŸããããã«ããã容éã倧ãããæ©åŸ®æ
å ±ãå«ããã¡ã€ã«ããã£ã¬ã¯ããªããäžçšæã«ããŒã¢ã³ã«éä¿¡ããã®ãåé¿ãããã ADD ã COPY ã䜿ã£ãŠã€ã¡ãŒãžã«å ããŠããŸãã®ãåé¿ãããããã®ã«åœ¹ç«ã¡ãŸãã
CLI 㯠.dockerignore ãã¡ã€ã«ããæ¹è¡ã§åºåããããã¿ãŒã³ã®äžèЧãšããŠè§£éããŸãããã¿ãŒã³ãšã¯ãUnix ã·ã§ã«ã® /foo/bar ãš foo/bar ã®ãã¿ãŒã³ã§ã¯ãã©ã¡ãã PATH ãããã㯠git ãªããžããªã®å Žæã瀺ã URL ã®ã«ãŒã以äžã§ã foo ãµããã£ã¬ã¯ããªå
ã® bar ãšããååã®ãã¡ã€ã«ããã£ã¬ã¯ããªãé€å€ããŸãããã以å€ã¯é€å€ããŸããã
.dockerignore ãã¡ã€ã«ã§ã¯ã # èšå·ã§å§ãŸãè¡ã¯ã³ã¡ã³ããšã¿ãªããã CLI ã«ãã£ãŠè§£éãããåã«ç¡èŠãããŸãã
ãã㯠.dockerignore ãã¡ã€ã«ã®äŸã§ãïŒ
# ã³ã¡ã³ã
*/temp*
*/*/temp*
temp?
ãã®ãã¡ã€ã«ã¯æ§ç¯æã«ä»¥äžã®æåãããŸãã
ã«ãŒã« |
æå |
|---|---|
|
ç¡èŠããã |
|
root 以äžã®ãããããµããã£ã¬ã¯ããªå
ã§ã |
|
root ãã2é局以äžã®ãµããã£ã¬ã¯ããªå
ã§ã |
|
ã«ãŒããã£ã¬ã¯ããªå
ã§ã |
äžèŽã«ã¯ Go èšèªã® filepath.Match ã䜿ããŸããååŠçãšããŠãååŸã®ç©ºçœãåé€ãã. ãš .. èŠçŽ ãåé€ããã®ã« Go èšèªã® filepath.Clean ã䜿ããŸããååŠçã«ããã空çœã«ãªã£ãè¡ã¯ç¡èŠãããŸãã
Go èšèªã® filepath.Match ã«ãŒã«ãæ¡åŒµãã Docker ã¯ç¹å¥ãªã¯ã€ã«ãã«ãŒãæåå ** ããµããŒãããŸããããã¯ãïŒ0ãå«ãïŒè€æ°ã®ãã£ã¬ã¯ããªã«äžèŽããŸããããšãã°ã **/*.go 㯠.go ã§çµãããã¹ãŠã®ãã¡ã€ã«ãé€å€ããŸããã€ãŸããæ§ç¯ã³ã³ãã¯ã¹ãã®ã«ãŒããå«ããå
šãŠã®ãã£ã¬ã¯ããªã察象ã§ãã
! ïŒãšã¯ã¹ã¯ã©ã¡ãŒã·ã§ã³ã»ããŒã¯ïŒã§å§ãŸãè¡ã¯ãé€å€å¯Ÿè±¡ã®äŸå€ãæå®ããŸããæ¬¡ã® .dockerignore ãã¡ã€ã«äŸã§ã¯ããã®ä»çµã¿ã䜿ã£ãŠããŸãïŒ
*.md
!README.md
ã³ã³ãã¯ã¹ããã README.md ã äŸå€ãšããŠé€ã ããã®ä»ãã¹ãŠã®ããŒã¯ããŠã³ãã¡ã€ã«ãé€å€ããŸãã
! ã«ããé€å€ã«å¯ŸããäŸå€ã«ãŒã«ã¯ãä»ã®æåã«ã圱é¿ããŸãã .dockerignore ãã¡ã€ã«ã«æžãããæçµè¡ã«ãã£ãŠãç¹å®ã®ãã¡ã€ã«ãé€å€ããããã©ãããæ±ºãŸãããŸããæ¬¡ã®äŸãèããŸãïŒ
*.md
!README*.md
README-secret.md
README-secret.md 以å€ã® README ãã¡ã€ã«ïŒ README*.md ïŒã¯äŸå€ãšããŠé€å€ãããŸãããããã®ä»ã®ããŒã¯ããŠã³ãã¡ã€ã«ïŒ *.md ïŒã¯ã³ã³ããã¹ãã«å«ãŸããŸããã
次ã¯ããã¡ãã®äŸãèããŸãïŒ
*.md
README-secret.md
!README*.md
ãã¹ãŠã® README ãã¡ã€ã«ãå«ãŸããŸãïŒé€å€ãããŸããïŒã !README*.md 㯠README-secret.md ãšäžèŽãããã€æåŸã®è¡ã«ããã®ã§ãçãäžã®è¡ã¯ç¡æå³ã§ãã
.dockerignore ãã¡ã€ã«ã䜿ãã Dockerfile ãš .dockerignore ãã¡ã€ã«ããé€å€ã§ããŸããé€å€èšå®ãããŠãããããã®ãã¡ã€ã«ã¯æ§ç¯åŠçã§å¿
èŠãªãããããŒã¢ã³ã«éä¿¡ãããŸããã§ããã ADD ãš COPY åœä»€ã§ããããã®ãã¡ã€ã«ãã€ã¡ãŒãžã«ã³ããŒããŸããã
ã»ãã«ã¯ãã³ã³ãã¯ã¹ãå
ã«ç¹å®ã®ãã¡ã€ã«ãé€å€ããã®ã§ã¯ãªããå
¥ããããã¡ã€ã«ãæå®ãããå Žåãããã§ãããããã®ããã«ã¯ã1ã€ãã®ãã¿ãŒã³ãšã㊠* ãæå®ãïŒäžåºŠãå
šãŠãé€å€ããïŒã以éã®è¡ã§ã¯ ! ã§äŸå€ãšãããã¿ãŒã³ãæå®ããŸãã
泚é
ãããŸã§ã®çµç·¯ã«ããããã¿ãŒã³ . ã¯ç¡èŠãããŸãã
FROM¶
FROM [--platform=<ãã©ãããã©ãŒã >] <ã€ã¡ãŒãžå> [AS <åå>]
ãŸãã¯
FROM [--platform=<ãã©ãããã©ãŒã >] <ã€ã¡ãŒãžå>[:<ã¿ã°>] [AS <åå>]
ãŸãã¯
FROM [--platform=<ãã©ãããã©ãŒã >] <ã€ã¡ãŒãžå>[@<ãã€ãžã§ã¹ã>] [AS <åå>]
FROM åœä»€ã¯ãæ°ãã Dockerfile ãšã¯ FROM åœä»€ã§å§ããå¿
èŠããããŸããã€ã¡ãŒãžãšã¯ãé©åãªã€ã¡ãŒãžã§ããã°äœã§ãæ§ããŸããã å
¬éãªããžã㪠ãã ã€ã¡ãŒãžãååŸããŠå§ãã ã®ããç¹ã«ç°¡åã§ãã
Dockerfileã§ã¯ãFROMãããåã«æžããåœä»€ã¯ARGã ãã§ãã ARG ãš FROM ã®çžäºäœçšãçè§£ ãã芧ãã ãããè€æ°ã®ã€ã¡ãŒãžãäœæããå Žåããããæ§ç¯ã¹ããŒãžãä»ããã®äŸåé¢ä¿ãšããŠçšããå Žåã®ããã1ã€ã®
Dockerfileã«è€æ°ã®FROMãæžããŸããæ°ããåFROMåœä»€ãåŠçãããåã«ã¯ããã®çŽåã§ã³ãããããããæãæ°ããã€ã¡ãŒãž ID ãåã«è¡šç€ºããã ãã§ããFROMåœä»€ããããã³ã«ããã以åã®åœä»€ã§äœæãããããããç¶æ ãã¯ãªã¢ã«ãªããŸãããªãã·ã§ã³ãšããŠã
FROMåœä»€ã«AS ååã远å ããæ°ããæ§ç¯ã¹ããŒãžã«ååãä»ããããŸãããã®ååã¯ã以éã®FROMãšCOPY --from=<åå>åœä»€ã§äœ¿çšãããã®ã¹ããŒãžã§æ§ç¯ããã€ã¡ãŒãžãåç §ã§ããŸããã¿ã°ããã€ãžã§ã¹ãå€ã¯ãªãã·ã§ã³ã§ããã©ã¡ããçç¥ãããšããã«ããŒã¯latestã¿ã°ã ãšããã©ã«ãã§æ±ãããŸããã¿ã°å€ïŒã«çžåœããã€ã¡ãŒãžåïŒãèŠã€ãããªããã°ããã«ããŒã¯ãšã©ãŒãè¿ããŸãã
FROM ã§ãã«ããã©ãããã©ãŒã 察å¿ã®ã€ã¡ãŒãžãåç
§ããå Žåã«ã¯ããªãã·ã§ã³ã® --platform ãã©ã°ã䜿ããšãç¹å®ã®ãã©ãããã©ãŒã åãã€ã¡ãŒãžãæå®ã§ããŸããããšãã°ã linux/amd64 ãã linux/arm64 ãã windows/amd64 ã§ããããã©ã«ãã§ã¯ãä»ãŸãã«å©çšããŠãããã©ãããã©ãŒã ã察象ãšããŠæ§ç¯ããŸãã --platform=$BUILDPLATFORM ïŒããããããã®ã¹ããŒãžå
ã§å¯Ÿè±¡ãã©ãããã©ãŒã åãã®ã¯ãã¹ã»ã³ã³ãã€ã«ãšããŠå©çšã§ããŸãã
ARG ãš FROM ã®çžäºäœçšãç解¶
1ã€ãã® FROM åœä»€ã®åã« ARG åœä»€ããããããã§å€æ°ã宣èšãããŠããã° FROM åœä»€ã§åç
§ã§ããŸãã
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras
FROM åœä»€ããåã«å®£èšããã ARG ã¯æ§ç¯ã¹ããŒãžå€ã®ããã FROM åœä»€ä»¥éã§äœ¿ããŸããã1ã€ãã® FROM ãããåã«å®£èšããã ARG ã®ããã©ã«ãå€ã䜿ãã«ã¯ãæ§ç¯ã¹ããŒãžå
ã§å€ãæããªã ARG åœä»€ã䜿ããŸãã
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
RUN¶
RUN ã«ã¯ïŒã€ã®åœ¢åŒããããŸãã
RUN <ã³ãã³ã>ïŒã·ã§ã«åœ¢åŒ ãã³ãã³ãã¯ã·ã§ã«å ã§å®è¡ããããããã©ã«ã㯠Linux ã/bin/sh -cã§ã Windows ã¯cmd /S /CïŒRUN ["å®è¡ãã¡ã€ã«", "ãã©ã¡ãŒã¿1", "ãã©ã¡ãŒã¿2"]ïŒå®è¡åœ¢åŒ ïŒ
RUN åœä»€ã¯ãçŸåšã®ã€ã¡ãŒãžãããäžã«ããæ°ããã¬ã€ã€ã§ã³ãã³ããå®è¡ãããã®çµæã Dockerfile ã®æ¬¡ã®ã¹ãããã§äœ¿ãããŸãã
RUN åœä»€ã®å®è¡ãšãã³ãããåŠçã«ãã£ãŠçæãããïŒã€ã¡ãŒãžã»ã¬ã€ã€ã®ïŒéå±€åãšã¯ãDocker ã®äžå¿ãšãªãèãæ¹ã«åºã¥ããŠããŸããããã¯ããœãŒã¹ã³ãŒãã管çãããã®ããã«ãæè»œã«ã³ããããã§ããã€ã¡ãŒãžå±¥æŽã®ã©ã®å Žæãããã³ã³ãããäœæã§ããŸãã
exec 圢åŒã¯ãã·ã§ã«äžã®åŠçã§æååãæ¹å€ãããªãããã«ããŸããå ããŠãã·ã§ã«ãå®è¡ãããã€ããªãå«ãŸãªãããŒã¹ã»ã€ã¡ãŒãžã§ãã RUN åœä»€ãå®è¡ã§ããããã«ããŸãã
ã·ã§ã«åœ¢åŒã§äœ¿ãããã©ã«ãã®ã·ã§ã«ã¯ã SHELL ã³ãã³ãã§å€æŽã§ããŸãã
ã·ã§ã«åœ¢åŒã§ \ ïŒããã¯ã¹ã©ãã·ã¥ïŒã䜿ããšã RUN åœä»€ã次ã®è¡ã«ç¶ããããŸããããšãã°ã次ã®ïŒè¡ãèããŸãã
RUN /bin/bash -c 'source $HOME/.bashrc ;\
echo $HOME'
ããã¯ã次ã®ïŒè¡ã«åãããã®ãšåãã§ãã
RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'
/bin/sh 以å€ã®ã·ã§ã«ã䜿ãã«ã¯ã exec 圢åŒã§äœ¿ãããã·ã§ã«ãæå®ããŸãã
RUN ["/bin/bash", "-c", "echo hello"]
泚é
exec 圢åŒã¯ JSON
ã·ã§ã«åœ¢åŒãšç°ãªãã exec 圢åŒã¯ã³ãã³ããšããŠã®ã·ã§ã«ãå®è¡ããŸãããã€ãŸããéåžžã®ã·ã§ã«ãšããŠã®åŠçãè¡ããŸãããããšãã°ã RUN [ "echo", "$HOME" ] ã§ã¯ã $HOME ã倿°å±éããŸãããããããã·ã§ã«ãšããŠã®åŠçãè¡ããããã°ãã·ã§ã«åœ¢åŒã䜿ããã RUN [ "sh", "-c", "echo $HOME" ] ã®ããã«ãçŽæ¥ã·ã§ã«ãå®è¡ããŸãã exec 圢åŒãããã¯çŽæ¥ã·ã§ã«ãå®è¡ããå Žåã¯ãã·ã§ã«åœ¢åŒãšåãããã«åŠçãããŠããããã«èŠããŸãããã·ã§ã«ãç°å¢å€æ°ãåŠçããŠããã®ã§ããã Docker ãè¡ã£ãŠããã®ã§ã¯ãããŸããã
泚é
ïŒexec 圢åŒã®èšè¿°æ¹æ³ã¯ JSON ã§ãïŒJSON 圢åŒã§ã¯ãããã¯ã¹ã©ãã·ã¥ããšã¹ã±ãŒãããå¿
èŠããããŸãããããç¹ã«é¢ä¿ããã®ã¯ã
RUN ["c:\windows\system32\tasklist.exe"]
ãã®äŸã®æ£ããæ§æã¯ããã¡ãã§ãã
RUN ["c:\\windows\\system32\\tasklist.exe"]
RUN åœä»€ïŒã§åŠçãããå
容ïŒã®ãã£ãã·ã¥ã¯ã次å以éã®æ§ç¯æã«ããèªåçã«æå¹ã§ãã RUN apt-get dist-upgrade -y ã®ãããªåœä»€ã«å¯Ÿãããã£ãã·ã¥ã¯ãæ¬¡ã®æ§ç¯æã«åå©çšãããŸãã RUN åœä»€ã«å¯Ÿãããã£ãã·ã¥ãç¡å¹ã«ããã«ã¯ã docker build --no-cache ã®ããã« --no-cache ãã©ã°ã䜿ããŸãã
詳现ã¯ãDockerfile ãæžããã¹ããã©ã¯ãã£ã¹ ãã芧ãã ããã
Dockerfile äžã« ADD åœä»€ãš COPY åœä»€ãåºãŠãããšã以éã® RUN åœä»€ã®å
容ã¯ãã£ãã·ã¥ãããŸããã
倿ããŠããåé¡ (RUN)¶
Issue 783 ã¯ã AUFS ãã¡ã€ã«ã·ã¹ãã äœ¿çšæã«çºçããããã¡ã€ã«ã®æš©éïŒããŒããã·ã§ã³ïŒã«ã€ããŠã®åé¡ã§ããããšãã°ããã¡ã€ã«ã
rmã§åé€ãããšãã«æ°ã¥ããããããŸããã
CMD¶
CMD åœä»€ã«ã¯ïŒã€ã®åœ¢åŒããããŸãã
CMD ["å®è¡ãã¡ã€ã«","ãã©ã¡ãŒã¿1","ãã©ã¡ãŒã¿2"]ïŒ exec 圢åŒããã¡ããæãŸãã ïŒCMD ["ãã©ã¡ãŒã¿1", "ãã©ã¡ãŒã¿2"]ïŒ ENTRYPOINT åœä»€ã«å¯Ÿããããã©ã«ãã®ãã©ã¡ãŒã¿ãšããŠæ±ãïŒCMD ã³ãã³ã ãã©ã¡ãŒã¿1 ãã©ã¡ãŒã¿2ïŒã·ã§ã«åœ¢åŒïŒ
CMD åœä»€ã¯ Dockerfile äžã§ïŒåºŠãã䜿ããŸãããè€æ°ã® CMD åœä»€ãããã°ãæåŸã® CMD ã®ã¿æå¹ã§ãã
CMD ã®äž»ãªç®çã¯ãã³ã³ããå®è¡æã®ããã©ã«ãïŒåæèšå®ïŒãæå®ããããã§ã ãããã©ã«ãã«ã¯ãå®è¡ãã¡ã€ã«ãå«ããå Žåããããã§ãªãå ŽåããããŸããå®è¡ãã¡ã€ã«ãå«ãŸãªãå Žåã¯ã ENTRYPOINT åœä»€ã®æå®ãå¿
èŠã§ãã
ENTRYPOINT åœä»€ã«å¯Ÿããããã©ã«ãã®åŒæ°ã CMD ã§æå®ããå Žåã¯ã CMD åœä»€ãš ENTRYPOINT åœä»€ã®äž¡æ¹ã JSON é
å圢åŒã§æå®ããå¿
èŠããããŸãã
泚é
exec 圢åŒã¯ JSON
ã·ã§ã«åœ¢åŒãšç°ãªãã exec 圢åŒã¯ã³ãã³ããšããŠã®ã·ã§ã«ãå®è¡ããŸãããã€ãŸããéåžžã®ã·ã§ã«ãšããŠã®åŠçãè¡ããŸãããããšãã°ã CMD [ "echo", "$HOME" ] ã§ã¯ã $HOME ã倿°å±éããŸãããããããã·ã§ã«ãšããŠã®åŠçãè¡ããããã°ãã·ã§ã«åœ¢åŒã䜿ããã CMD [ "sh", "-c", "echo $HOME" ] ã®ããã«ãçŽæ¥ã·ã§ã«ãå®è¡ããŸãã exec 圢åŒãããã¯çŽæ¥ã·ã§ã«ãå®è¡ããå Žåã¯ãã·ã§ã«åœ¢åŒãšåãããã«åŠçãããŠããããã«èŠããŸãããã·ã§ã«ãç°å¢å€æ°ãåŠçããŠããã®ã§ããã Docker ãè¡ã£ãŠããã®ã§ã¯ãããŸããã
ã·ã§ã«åœ¢åŒã exec 圢åŒã® CMD åœä»€ãšã¯ã察象ã€ã¡ãŒãžã®èµ·åæã«åŠçããã³ãã³ããæå®ããŸãã
CMD ãã·ã§ã«åœ¢åŒã«ããå Žåã /bin/sh -c ã®äžã§ <ã³ãã³ã> ãå®è¡ãããŸãã
FROM ubuntu
CMD echo "This is a test." | wc -
ã·ã§ã«ã䜿ããã« <ã³ãã³ã> ãå®è¡ ããããã°ãJSON é åãšããŠã³ãã³ããèšè¿°ããå¿ èŠãããããã®å®è¡ãã¡ã€ã«ã¯ãã«ãã¹ã§æå®ããŸãã ãã®ãJSON é å圢åŒããCMD ã§ã®æãŸãããã©ãŒãããã§ã ããã©ã¡ãŒã¿ã远å ããã«ã¯ããã®é åå ã§ïŒã€ïŒã€ã®æååãšããŠèšè¿°ããŸãã
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
ã³ã³ãããèµ·åãããã³ã«ãåãã³ãã³ããæ¯åå®è¡ããã®ã§ããã°ã ENTRYPOINT åœä»€ãš CMD åœä»€ã®çµã¿åãããæ€èšãã ããã詳ãã㯠ãã芧ãã ããã
docker run ã§åŒæ°ãæå®ãããšã CMD ã§æå®ãããŠããããã©ã«ãã®æåãäžæžãã§ããŸãã
泚é
RUN ãš CMD ãæ··åããªãã§ãã ããã RUN ã¯å®éã«ã³ãã³ããå®è¡ãããã®çµæãã³ãããããŸãã察ããŠã CMD ã¯æ§ç¯æã«ã¯äœãå®è¡ããŸããããã€ã¡ãŒãžã䜿ã£ãŠå®è¡ãããã³ãã³ããæå®ãããã®ã§ãã
LABEL¶
LABEL <ããŒ>=<å€> <ããŒ>=<å€> <ããŒ>=<å€> ...
LABEL åœä»€ã¯ãã€ã¡ãŒãžã« LABEL 㯠LABEl ã®å€ã«ç©ºçœãããå Žåã¯ãã³ãã³ãã©ã€ã³ã§ã®æ§æè§£æãšåãããã«ãåŒçšç¬Šãšããã¯ã©ãã·ã¥ã䜿ããŸããããã€ãã®äœ¿çšäŸããã¡ãã§ãã
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
ã€ã¡ãŒãžã¯è€æ°ã®ã©ãã«ãæãŠãŸããïŒè¡ã§è€æ°ã®ã©ãã«ãæå®ã§ããŸãã Docker 1.10 æªæºã§ã¯ããã®ææ³ã§æçµã€ã¡ãŒãžã®å®¹éãæžãããŸããããä»ã¯éããŸããããã§ãïŒè¡ã§æžãæ¹æ³ãéžæããã®ã§ããã°ãïŒã€ã®æ¹æ³ããããŸãã
LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
ããŒã¹ã»ã€ã¡ãŒãžã芪ã€ã¡ãŒãžïŒ FROM è¡ã«ããã€ã¡ãŒãžïŒãå«ãã©ãã«ã¯ãã€ã¡ãŒãžã§ç¶æ¿ãããŸããã©ãã«ãæ¢ã«ååšããŠããŠãããã®å€ãéãå Žåã¯ãçŽè¿ã§è¿œå ãããå€ã§ã以åã®å€ãäžæžãããŸãã
ã€ã¡ãŒãžã®ã©ãã«ã衚瀺ããã«ã¯ã docker image inspect ã³ãã³ãã䜿ããŸãã --format ãªãã·ã§ã³ã䜿ãã°ãã©ãã«ã®ã¿è¡šç€ºã§ããŸãã
$ docker image inspect --format='' myimage
"Labels": {
"com.example.vendor": "ACME Incorporated"
"com.example.label-with-value": "foo",
"version": "1.0",
"description": "This text illustrates that label-values can span multiple lines.",
"multi.label1": "value1",
"multi.label2": "value2",
"other": "value3"
},
MAINTAINERïŒéæšå¥šïŒÂ¶
MAINTAINER <åå>
MAINTAINER åœä»€ã¯ãã€ã¡ãŒãžãäœæãã Author ïŒäœæè
ïŒã®ãã£ãŒã«ããèšå®ããŸãããã®åœä»€ããã LABEL åœä»€ã®ã»ãããããæè»ã§ããããã¡ãã䜿ãã¹ãã§ããããã«ãããå¿
èŠãªã¡ã¿ããŒã¿ã®èšå®ãç°¡åã«ãªãã docker inspect ãªã©ã§ç°¡åã«è¡šç€ºã§ããŸãã MAINTAINER ãã£ãŒã«ãã«çžåœããã©ãã«ã¯ã次ã®ããã«æå®ããŸãã
LABEL maintainer="SvenDowideit@home.org.au"
ããããŠããã°ã docker inspect ã§ä»ã®ã©ãã«ãšäžç·ã«è¡šç€ºã§ããŸãã
EXPOSE¶
EXPOSE <ããŒã> [<ããŒã>/<ãããã³ã«>...]
ã³ã³ããã®å®è¡æãæå®ãã EXPOSE åœä»€ã§ãã察象ããŒãã TCP ã UDP ããã©ã¡ãããªãã¹ã³ãããæå®ã§ããŸãããããã³ã«ã®æå®ããªããã°ã TCP ãããã©ã«ãã§ãã
EXPOSE åœä»€ã ãã¯ãå®éã«ã¯ããŒãã docker run ã§ -p ãã©ã°ã䜿ããå
¬éçšã®ããŒããšå²ãåœãŠãïŒ
EXPOSE ã¯ããã©ã«ãã§ TCP ãåæãšããŸããã UDP ãæå®ã§ããŸãã
EXPOSE 80/udp
TCP ãš UDP ã®äž¡æ¹ãå ¬éããã«ã¯ã2è¡ã§æžããŸãã
EXPOSE 80/tcp
EXPOSE 80/udp
ãã®äŸã§ã docker run ã§ -P ãªãã·ã§ã³ãä»ãããšãTCP ãš UDP ã®ããããã«ããŒããå
¬éããŸããæ³šæç¹ãšããŠã¯ã -P ã䜿ããšããã¹ãäžã§
EXPOSE ã®èšå®ã«é¢ä¿ãªããå®è¡æã« -p ãã©ã°ã䜿ãããã®èšå®ãäžæžãåºæ¥ãŸããããšãã°ã次ã®ããã«ããŸãã
docker run -p 80:80/tcp -p 80:80/udp ...
ãã¹ãã·ã¹ãã äžã§ããŒã転éãèšå®ããã«ã¯ã -P ãã©ã°ã®äœ¿ãæ¹ ãã芧ãã ããã docker network ã³ãã³ãã¯ã³ã³ããéã§éä¿¡ãããããã¯ãŒã¯ã®äœæããµããŒãããŸãããç¹å®ã®ããŒããé²åºãããå
¬éããããæå®ããå¿
èŠã¯ãããŸãããããã¯ããããã¯ãŒã¯ã«æ¥ç¶ããŠããè€æ°ã®ã³ã³ããã¯ãããããããŒããéããŠçžäºã«éä¿¡ã§ããããã§ããè©³çŽ°ãªæ
å ±ã¯ã ãã®æ©èœã®äžæžã ãã芧ãã ããã
ENV¶
ENV <ããŒ>=<å€> ...
ENV åœä»€ã¯ãç°å¢å€æ° <ããŒ> ã«å¯Ÿããå€ã <å€> ãšããŠèšå®ããŸãããã®å€ã¯ã以éã«ç¶ãæ§ç¯ã¹ããŒãžäžã§ãç°å¢å€æ°ãšããŠä¿æãããŸãããã®äžãå€ãã®å Žåã ãã®éäžã§çœ®ãæã å¯èœã§ããå€ã¯ãä»ã®ç°å¢å€æ°ã瀺ããã®ãšããŠãè§£éã§ããŸãããã®ãããåŒçšç¬Šã¯ãšã¹ã±ãŒãããªããã°åé€ãããŸããã³ãã³ãã©ã€ã³ã§ã®æ§æè§£éãšåæ§ã«ãåŒçšç¬Šãšããã¯ã©ãã·ã¥ã«ãã£ãŠãå€ã®ãªãã§ç©ºçœã䜿ããããã«ãªããŸãã
äŸïŒ
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
ENV åœä»€ã§ã¯ãäžåºŠã«è€æ°ã® <ããŒ>=<å€> ... 倿°ãæå®ã§ããŸããæ¬¡ã®äŸã¯ãå
ã»ã©ã®äŸã®çµæãšïŒç°å¢å€æ°ã®å€ãïŒå®å
šã«åãã«ãªããŸãã
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
ENV åœä»€ã䜿ãèšå®ããç°å¢å€æ°ã¯ãçµæãšããŠäœæãããã€ã¡ãŒãžããå®è¡ããã³ã³ããã§ãç¶æãããŸãã docker inspect ã䜿ãããã®å€ã確èªã§ããŸãããããŠããããã倿Žããã«ã¯ docker run --env <ããŒ>=<å€> ã䜿ããŸãã
ç°å¢å€æ°ã®ç¶æã¯ãäºæããªãæªåœ±é¿ãåŒãèµ·ããå¯èœæ§ããããŸããããšãã°ã ENV DEBIAN_FRONTEND=noninteractive ãèšå®ãããšã apt-get ã®æåãå€ããŸãããã®ãããã€ã¡ãŒãžã®å©çšè
ãæ··ä¹±ããããããããŸããã
ç°å¢å€æ°ãæ§ç¯äžã®ã¿å¿ èŠã§ãæçµã€ã¡ãŒãžã§äžèŠãªå Žåã¯ã代ããã«ã³ãã³ãã§å€ã®æå®ãæ€èšãã ããã
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
ãããã¯ã ARG ã䜿ãã°ãæçµã€ã¡ãŒãžã§ã¯ä¿æãããŸããã
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
泚é
å¥ã®æžãæ¹
ENV åœä»€ã§ã¯ã ENV <ããŒ> <å€> ã®ããã«ã = ãçç¥ããå¥ã®æ§æããããŸããäŸïŒ
ENV MY_VAR my-value
ãã®æ§æã§ã¯ã1ã€ã® ENV åœä»€ã§ãè€æ°ã®ç°å¢å€æ°ãèšå®ã§ããŸããããã®ãããæ··ä¹±ãåŒãèµ·ããå¯èœæ§ããããŸããããšãã°ã以äžã®æå®ã§ã¯ã1ã€ã®ç°å¢å€æ°ïŒ ONE ïŒã«å¯Ÿããå€ "TWO= THREE=world" ãèšå®ããŸãã
ENV ONE TWO= THREE=world
åŸæ¹äºæã®ããããã®å¥ã®æžãæ¹ããµããŒããããŠããŸããããããå è¿°ã§èª¬æããçç±ã®ããã䜿ããªãã»ããè¯ãã§ããããå ããŠãå°æ¥ã®ãªãªãŒã¹ã§ã¯åé€ãããå¯èœæ§ããããŸãã
ADD¶
ADD ã«ã¯ 2 ã€ã®åœ¢åŒããããŸãã
ADD [--chown=<ãŠãŒã¶>:<ã°ã«ãŒã>] <远å å
>... <远å å
>
ADD [--chown=<ãŠãŒã¶>:<ã°ã«ãŒã>] ["<远å å
>",... "<远å å
>"]
ãã¹ã«ç©ºçœãå«ãå Žåã«ã¯ãåŸè ã®åœ¢åŒãå¿ èŠã§ãã
泚é
--chown æ©èœããµããŒããããŠããã®ã¯ã Linux ã³ã³ãããæ§ç¯ããããã«äœ¿ã Dockerfile äžã®ã¿ã§ãããã®ããã Windows ã³ã³ããäžã§ã¯æ©èœããŸãããLinux ãš Windows éã§ã¯ããŠãŒã¶ãšã°ã«ãŒãã®ææè
ã«é¢ããæŠå¿µã倿ã§ããŸããããŠãŒã¶åãšã°ã«ãŒãåã ID ã«å€æããã«ã¯ã /etc/passwd ãš /etc/group ã䜿ããŸããããããã§ããã®ã¯ Linux OS ãããŒã¹ãšããã³ã³ããã®ã¿ã§ãã
ADD åœä»€ã§ã¯ã远å ããããã¡ã€ã«ããã£ã¬ã¯ããªããªã¢ãŒããã¡ã€ã«ã® URL ã <远å å
> ã§æå®ãããšãããããã€ã¡ãŒãžã®ãã¡ã€ã«ã·ã¹ãã äžã®ãã¹ <远å å
> ã«è¿œå ããŸãã
è€æ°ã® 远å å
ãªãœãŒã¹ãæå®ã§ããŸãããã¡ã€ã«ããã£ã¬ã¯ããªã®å Žåãããããã®ãã¹ã¯ãæ§ç¯ã³ã³ããã¹ãã®è¿œå å
ã«å¯Ÿããçžå¯Ÿãã¹ãšããŠè§£éãããŸãã
ãããã㮠远å å
ã«ã¯ãGo èšèªã® filepath.Match ã«ãŒã«ã䜿ããã¯ã€ã«ãã«ãŒããäžèŽãåŠçãããŸãã
"hom" ã§å§ãŸããã¡ã€ã«ãã¹ãŠã远å ããã«ã¯ã次ã®ããã«ããŸãã
ADD hom* /mydir/
次ã®äŸã§ã¯ã ? 㯠"home.txt" ã®ãããª1æåã«çœ®ãæããããŸãã
ADD hom?.txt /mydir/
<远å å
> ã¯çµ¶å¯Ÿãã¹ã WORKDIR ïŒäœæ¥ãã£ã¬ã¯ããªïŒããã®çžå¯Ÿãã¹ã§ããããããã®ïŒè¿œå å
ã®ïŒãœãŒã¹ãéä¿¡å
ã³ã³ããå
ã«ã³ããŒããŸãã
以äžã¯çžå¯Ÿãã¹ã䜿ãäŸã§ã "test.txt" ã <WORKDIR>/relativeDir/ ïŒçžå¯Ÿãã£ã¬ã¯ããªïŒã«è¿œå ããŸãã
ADD test.txt relativeDir/
次ã¯çµ¶å¯Ÿãã¹ã䜿ãäŸã§ãã /absoluteDir/ ïŒçžå¯Ÿãã£ã¬ã¯ããªïŒã« "test.txt" ã远å ããŸãã
ADD test.txt /absoluteDir/
ç¹æ®æåïŒ [ ã ] ãªã©ïŒãå«ããã¡ã€ã«ããã£ã¬ã¯ããªã远å ããå Žåã¯ãGo èšèªã®ã«ãŒã«ã«åŸããåãã¹ããšã¹ã±ãŒãããå¿
èŠããããŸããããšãã°ããã¡ã€ã«å arr[0].txt ã远å ããã«ã¯ã次ã®ããã«ããŸãã
ADD arr[[]0].txt /mydir/
æ°ãããã¡ã€ã«ããã£ã¬ã¯ããªã¯ããªãã·ã§ã³ã® --chown ãã©ã°ã§ãŠãŒã¶åãã°ã«ãŒãåãUID/GID ã®çµã¿åãããŠè¿œå å¯Ÿè±¡ã®æš©éæå®ãªã¯ãšã¹ããæå®ããªãéãã UID ãš GID ã 0 ãšããŠäœæãããŸãã --chown ãã©ã°ã®æžåŒã«ããããŠãŒã¶åãšã°ã«ãŒãåã®æååã®æå®ããæŽæ°ãšããŠçŽæ¥ UID ãš GID ã®ããããçµã¿åããã®æå®ãã§ããŸãããŠãŒã¶åãã°ã«ãŒãåãæå®ãããšãã³ã³ããã®ã«ãŒãã»ãã¡ã€ã«ã·ã¹ãã äžã«ãã /etc/passwd ãš /etc/group ãã¡ã€ã«ã䜿ãããã®ååããé©åãªæŽæ°ã® UID ã GID ã«ãããã倿ããåŠçãè¡ãããŸãã以äžã¯ --chown ãã©ã°ã䜿ã£ãŠé©åã«å®çŸ©ããäŸã§ãã
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
ããããã³ã³ããã®ã«ãŒãã»ãã¡ã€ã«ã·ã¹ãã ã« /etc/passwd ã /etc/group ãã¡ã€ã«ãç¡ããããã« --chown ãã©ã°ã§äœ¿ããããŠãŒã¶åãã°ã«ãŒãåãååšããªãå Žåã¯ã ADD ã®åŠç段éã§æ§ç¯ã倱æããŸããæŽæ°ã§ ID ãæå®ãããšãïŒãŠãŒã¶åãååšããŠãããã©ããïŒæ€çŽ¢ããå¿
èŠããªããã³ã³ããã®ã«ãŒãã»ãã¡ã€ã«ã·ã¹ãã ã®å
容ã«äŸåããŸããã
<远å å
> ããªã¢ãŒãã«ãããã¡ã€ã« URL ã®å Žåã«ã¯ã远å å
ã®ããŒããã·ã§ã³ã¯ 600 ã«ãªããŸãããããããªã¢ãŒããã¡ã€ã«ã®ååŸæã« HTTP ããã Last-Modified ãããã°ã远å å
ã® mtime ãèšå®ããããã«äœ¿ããŸããããããªããã ADD ã®éäžã§åŠçãããä»ã®ãã¡ã€ã«ãšåãããã«ããã¡ã€ã«ã倿Žããããã©ãããããã£ãã·ã¥ãæŽæ°ãããã©ããã倿ããããã« mtime ã¯äœ¿ãããŸããã
泚é
docker build - < ãã¡ã€ã«å ïŒ Dockerfile ãæž¡ããŠæ§ç¯ããå Žåã¯ã Dockerfile ã§ URL ãããŒã¹ãšãã ADD ã®ã¿è¿œå å¯èœã§ãããŸããæšæºå
¥åã§å§çž®ããã¢ãŒã«ã€ããæž¡ããŸãïŒ docker build - < archive.tar.gz ïŒã®ã§ãã¢ãŒã«ã€ãã®ã«ãŒãã«ãã Dockerfile ãšã以éã«ç¶ãã¢ãŒã«ã€ãå
容ããæ§ç¯çšã®ã³ã³ãã¯ã¹ããšããŠå©çšãããŸãã
ããã URL ãã¡ã€ã«ãèªèšŒã«ãã£ãŠä¿è·ãããŠããå ŽåãADD åœä»€ã¯èªèšŒããµããŒãããŠããªããããã³ã³ããå
ã§ RUN wget ã RUN curl ãªã©ä»ã®ããŒã«ã䜿ãå¿
èŠããããŸãã
泚é
ADD åœä»€ãåŠçããã«ãããã <远å å
> ã®å
容ã倿ŽãããŠããå Žåã¯ããã® Dockerfile ã®å¯Ÿè±¡è¡ä»¥éã§ãã£ãã·ã¥ãç¡å¹ã«ããŸããRUN åœä»€ã®ããã®ãã£ãã·ã¥ããç¡å¹ã«ãªã察象ã§ãã詳ããæ
å ±ã¯ ãã¹ããã©ã¯ãã£ã¹ã»ã¬ã€ã - æ§ç¯ãã£ãã·ã¥ã®æŽ»çš ãã芧ãã ããã
ADD ã¯ä»¥äžã®ã«ãŒã«ã«åŸããŸãã
<远å å >ã®ãã¹ã¯ãæ§ç¯ã³ã³ãã¯ã¹ãå ã«ããå¿ èŠããããŸããã€ãŸããADD .../ã©ãã /ã©ããã®ããã«æå®ã§ããŸãããããã¯ãdocker buildã®ç¬¬äžæ®µéããã³ã³ãã¯ã¹ã察象ã®ãã£ã¬ã¯ããªïŒãšãµããã£ã¬ã¯ããªïŒã docker ããŒã¢ã³ã«å¯ŸããŠéä¿¡ããããã§ããããã
<远å å >ã URL ã§è¿œå å ã®æåŸãã¹ã©ãã·ã¥èšå· ã§çµãã£ãŠããªããã°ãURL ãããã¡ã€ã«ãããŠã³ããŒãããåŸã<远å å >ã«ã³ããŒããŸããããã
<远å å >ã URL ã§è¿œå å ã®æåŸãã¹ã©ãã·ã¥èšå· ã§çµãã£ãŠããã°ãURL ãããã¡ã€ã«åãæšæž¬ãããããã<远å å >/<ãã¡ã€ã«å>ã«ãã¡ã€ã«ãããŠã³ããŒãããŸããããšãã°ãADD http://example.com/foobar /ã¯ããã¡ã€ã«/foobarãäœæããŸãããã®éãé©åãªãã¡ã€ã«åãæ€åºã§ãããããããããURL ã«ã¯äœããã®ãã¹ãå«ããå¿ èŠããããŸãïŒhttp://example.comã¯åäœããŸãã ïŒã<远å å >ããã£ã¬ã¯ããªã§ããã°ããã¡ã€ã«ã·ã¹ãã ã®ã¡ã¿ããŒã¿ãå«ãããã£ã¬ã¯ããªã®å 容ãã¹ãŠãã³ããŒãããŸãã
泚é
察象ãã£ã¬ã¯ããªãã®ãã®ã¯ã³ããŒããŸããããã£ã¬ã¯ããªã®å 容ã®ã¿ã³ããŒå¯Ÿè±¡ã§ãã
<远å å >ãããŒã«ã«ã«ãããèªèã§ããå§çž®åœ¢åŒïŒç¡å§çž® ã gzip ã gzip2ãxz ïŒã® tar ã¢ãŒã«ã€ãã®å Žåã¯ããã£ã¬ã¯ããªãšããŠå±é ããŸãããªã¢ãŒã URL ããã®ãªãœãŒã¹ã¯å±é ããŸãã ããã£ã¬ã¯ããªã®ã³ããŒãŸãã¯å±éã¯ãtar -xã®æåãšåããæ¬¡ã®åŠçã®çµã¿åããã§ããéä¿¡å ã«äœããã®ãã¹ãååšããŠãããã
1ã€1ã€ã®ãã¡ã€ã«ããšã«ããœãŒã¹ããªãŒã«å«ãŸããæ¹ãåªå ããŠåŠçïŒã³ããŒïŒãã
泚é
ãã¡ã€ã«ãèªèã§ããå§çž®åœ¢åŒãã©ããã«ãããããããã¡ã€ã«åã§ã¯ãªãã察象ãã¡ã€ã«ã®å 容ã«åºã¥ããŠåŠçãè¡ãããŸããããšãã°ã空ãã¡ã€ã«ã®ååã
.tar.gzã ãšããŠãïœãããã¯å§çž®ãã¡ã€ã«ãšã¯èªèãããããã¡ã€ã«å±éã«é¢ãããšã©ãŒã¡ãã»ãŒãžã¯äžå衚瀺 ããã ãããã©ãããããã¡ã€ã«ã¯åã«è¿œå å ã«ã³ããŒãããŸãã
远å å ãäœããã®ãã¡ã€ã«ã®å Žåã¯ããã®ã¡ã¿ããŒã¿ãšäžç·ã«åå¥ã«ã³ããŒãããŸãã<远å å >ãã¹ã©ãã·ã¥èšå· ã§çµãã£ãŠããå Žåã¯ãããããã£ã¬ã¯ããªãšã¿ãªããã<远å å >ã¯<远å å >/base(<éä¿¡å >)ã«æžã蟌ãŸããŸããè€æ°ã®
<远å å >ãã¹ã©ãã·ã¥èšå· ã§çµãã£ãŠããªããã°ã察象ã¯éåžžã®ãã¡ã€ã«ãšã¿ãªããã<远å å >ã®å 容ãã<远å å >ã«æžã蟌ãŸããŸãã<远å å >ãååšããªãå Žåã¯ã察象ãã¹å ã«ååšããŠããªããã£ã¬ã¯ããªå šãŠãšå ±ã«äœæãããŸãã
COPY¶
COPY ã«ã¯ 2 ã€ã®åœ¢åŒããããŸãã
COPY [--chown=<ãŠãŒã¶>:<ã°ã«ãŒã>] <ã³ããŒå
>... <ã³ããŒå
>
COPY [--chown=<ãŠãŒã¶>:<ã°ã«ãŒã>] ["<ã³ããŒå
>",... "<ã³ããŒå
>"]
ãã¹ã«ç©ºçœãå«ãå Žåã«ã¯ãåŸè ã®åœ¢åŒãå¿ èŠã§ãã
泚é
--chown æ©èœããµããŒããããŠããã®ã¯ã Linux ã³ã³ãããæ§ç¯ããããã«äœ¿ã Dockerfile äžã®ã¿ã§ãããã®ããã Windows ã³ã³ããäžã§ã¯æ©èœããŸãããLinux ãš Windows éã§ã¯ããŠãŒã¶ãšã°ã«ãŒãã®ææè
ã«é¢ããæŠå¿µã倿ã§ããŸããããŠãŒã¶åãšã°ã«ãŒãåã ID ã«å€æããã«ã¯ã /etc/passwd ãš /etc/group ã䜿ããŸããããããã§ããã®ã¯ Linux OS ãããŒã¹ãšããã³ã³ããã®ã¿ã§ãã
COPY åœä»€ã§ã¯ã远å ããããã¡ã€ã«ããã£ã¬ã¯ããªã <ã³ããŒå
> ã§æå®ãããšãããããã€ã¡ãŒãžã®ãã¡ã€ã«ã·ã¹ãã äžã®ãã¹ <ã³ããŒå
> ã«è¿œå ããŸãã
è€æ°ã® ã³ããŒå
ãªãœãŒã¹ãæå®ã§ããŸãããã¡ã€ã«ããã£ã¬ã¯ããªã®å Žåãããããã®ãã¹ã¯ãæ§ç¯ã³ã³ããã¹ãã®ã³ããŒå
ã«å¯Ÿããçžå¯Ÿãã¹ãšããŠè§£éãããŸãã
ããããã® ã³ããŒå
ã«ã¯ãGo èšèªã® filepath.Match ã«ãŒã«ã䜿ããã¯ã€ã«ãã«ãŒããäžèŽãåŠçãããŸãã
"hom" ã§å§ãŸããã¡ã€ã«ãã¹ãŠã远å ããã«ã¯ã次ã®ããã«ããŸãã
COPY hom* /mydir/
次ã®äŸã§ã¯ã ? 㯠"home.txt" ã®ãããª1æåã«çœ®ãæããããŸãã
COPY hom?.txt /mydir/
<ã³ããŒå
> ã¯çµ¶å¯Ÿãã¹ã WORKDIR ïŒäœæ¥ãã£ã¬ã¯ããªïŒããã®çžå¯Ÿãã¹ã§ããããããã®ïŒã³ããŒå
ã®ïŒãœãŒã¹ãéä¿¡å
ã³ã³ããå
ã«ã³ããŒããŸãã
以äžã¯çžå¯Ÿãã¹ã䜿ãäŸã§ã "test.txt" ã <WORKDIR>/relativeDir/ ïŒçžå¯Ÿãã£ã¬ã¯ããªïŒã«è¿œå ããŸãã
COPY test.txt relativeDir/
次ã¯çµ¶å¯Ÿãã¹ã䜿ãäŸã§ãã /absoluteDir/ ïŒçžå¯Ÿãã£ã¬ã¯ããªïŒã« "test.txt" ã远å ããŸãã
COPY test.txt /absoluteDir/
ç¹æ®æåïŒ [ ã ] ãªã©ïŒãå«ããã¡ã€ã«ããã£ã¬ã¯ããªã远å ããå Žåã¯ãGo èšèªã®ã«ãŒã«ã«åŸããåãã¹ããšã¹ã±ãŒãããå¿
èŠããããŸããããšãã°ããã¡ã€ã«å arr[0].txt, ã远å ããã«ã¯ã次ã®ããã«ããŸãã
COPY arr[[]0].txt /mydir/
æ°ãããã¡ã€ã«ããã£ã¬ã¯ããªã¯ããªãã·ã§ã³ã® --chown ãã©ã°ã§ãŠãŒã¶åãã°ã«ãŒãåãUID/GID ã®çµã¿åãããŠè¿œå å¯Ÿè±¡ã®æš©éæå®ãªã¯ãšã¹ããæå®ããªãéãã UID ãš GID ã 0 ãšããŠäœæãããŸãã --chown ãã©ã°ã®æžåŒã«ããããŠãŒã¶åãšã°ã«ãŒãåã®æååã®æå®ããæŽæ°ãšããŠçŽæ¥ UID ãš GID ã®ããããçµã¿åããã®æå®ãã§ããŸãããŠãŒã¶åãã°ã«ãŒãåãæå®ãããšãã³ã³ããã®ã«ãŒãã»ãã¡ã€ã«ã·ã¹ãã äžã«ãã /etc/passwd ãš /etc/group ãã¡ã€ã«ã䜿ãããã®ååããé©åãªæŽæ°ã® UID ã GID ã«ãããã倿ããåŠçãè¡ãããŸãã以äžã¯ --chown ãã©ã°ã䜿ã£ãŠé©åã«å®çŸ©ããäŸã§ãã
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
ããããã³ã³ããã®ã«ãŒãã»ãã¡ã€ã«ã·ã¹ãã ã« /etc/passwd ã /etc/group ãã¡ã€ã«ãç¡ããããã« --chown ãã©ã°ã§äœ¿ããããŠãŒã¶åãã°ã«ãŒãåãååšããªãå Žåã¯ã COPY ã®åŠç段éã§æ§ç¯ã倱æããŸããæŽæ°ã§ ID ãæå®ãããšãïŒãŠãŒã¶åãååšããŠãããã©ããïŒæ€çŽ¢ããå¿
èŠããªããã³ã³ããã®ã«ãŒãã»ãã¡ã€ã«ã·ã¹ãã ã®å
容ã«äŸåããŸããã
泚é
docker build - < ãã¡ã€ã«å ïŒ Dockerfile ãæž¡ããŠæ§ç¯ããããšããŠãã COPY ã¯äœ¿ããŸããã
ãªãã·ã§ã³ã§ããããŸã§ã®ïŒ FROM .. AS <åå> ãšããŠäœæããïŒæ§ç¯ã¹ããŒãžãã³ããŒå
ïŒãœãŒã¹ïŒã®å ŽæãšããŠæå®ããããã«ã COPY ã§ --from=<åå> ãã©ã°ãå©çšã§ããŸããããã¯ããŠãŒã¶èªèº«ãæ§ç¯ã³ã³ããã¹ããéãäœæ¥ã®æ¿ãããšãªããŸãã
COPY ã¯ä»¥äžã®ã«ãŒã«ã«åŸããŸãã
<ã³ããŒå >ã®ãã¹ã¯ãæ§ç¯ã³ã³ãã¯ã¹ãå ã«ããå¿ èŠããããŸããã€ãŸããCOPY .../ã©ãã /ã©ããã®ããã«æå®ã§ããŸãããããã¯ãdocker buildã®ç¬¬äžæ®µéããã³ã³ãã¯ã¹ã察象ã®ãã£ã¬ã¯ããªïŒãšãµããã£ã¬ã¯ããªïŒã docker ããŒã¢ã³ã«å¯ŸããŠéä¿¡ããããã§ãã<ã³ããŒå >ããã£ã¬ã¯ããªã§ããã°ããã¡ã€ã«ã·ã¹ãã ã®ã¡ã¿ããŒã¿ãå«ãããã£ã¬ã¯ããªã®å 容ãã¹ãŠãã³ããŒãããŸãã
泚é
察象ãã£ã¬ã¯ããªãã®ãã®ã¯ã³ããŒããŸããããã£ã¬ã¯ããªã®å 容ã®ã¿ã³ããŒå¯Ÿè±¡ã§ãã
ã³ããŒå ãäœããã®ãã¡ã€ã«ã®å Žåã¯ããã®ã¡ã¿ããŒã¿ãšäžç·ã«åå¥ã«ã³ããŒãããŸãã<ã³ããŒå >ãã¹ã©ãã·ã¥èšå· ã§çµãã£ãŠããå Žåã¯ãããããã£ã¬ã¯ããªãšã¿ãªããã<ã³ããŒå >ã¯<ã³ããŒå >/base(<ã³ããŒå >)ã«æžã蟌ãŸããŸããè€æ°ã®
<ã³ããŒå >ãã¹ã©ãã·ã¥èšå· ã§çµãã£ãŠããªããã°ã察象ã¯éåžžã®ãã¡ã€ã«ãšã¿ãªããã<ã³ããŒå >ã®å 容ãã<ã³ããŒå >ã«æžã蟌ãŸããŸãã<ã³ããŒå >ãååšããªãå Žåã¯ã察象ãã¹å ã«ååšããŠããªããã£ã¬ã¯ããªå šãŠãšå ±ã«äœæãããŸãã
泚é
COPY åœä»€ãåŠçããã«ãããã <ã³ããŒå
> ã®å
容ã倿ŽãããŠããå Žåã¯ããã® Dockerfile ã®å¯Ÿè±¡è¡ä»¥éã§ãã£ãã·ã¥ãç¡å¹ã«ããŸããRUN åœä»€ã®ããã®ãã£ãã·ã¥ããç¡å¹ã«ãªã察象ã§ãã詳ããæ
å ±ã¯ ãã¹ããã©ã¯ãã£ã¹ã»ã¬ã€ã - æ§ç¯ãã£ãã·ã¥ã®æŽ»çš ãã芧ãã ããã
ENTRYPOINT¶
ENTRYPOINT ã«ã¯ïŒã€ã®åœ¢åŒããããŸãã
exec 圢åŒã¯ãæšå¥šãããŠãã圢åŒã§ãïŒ
ENTRYPOINT ["å®è¡ãã¡ã€ã«", "ãã©ã¡ãŒã¿1", "ãã©ã¡ãŒã¿2"]
shell 圢åŒïŒ
ENTRYPOINT ã³ãã³ã ãã©ã¡ãŒã¿1 ãã©ã¡ãŒã¿2
ENTRYPOINT ã¯ãã³ã³ããã
ããšãã°ã以äžã¯ããã©ã«ãèšå®ã® nginx ããããŒã 80 ããªãã¹ã³ããŠèµ·åããŸãã
docker run -i -t --rm -p 80:80 nginx
ã³ãã³ãã©ã€ã³ã§ã® docker run <ã€ã¡ãŒãžå> ã«å¯ŸããåŒæ°ã¯ã exec 圢åŒã® ENTRYPOINT ã®å
šèŠçŽ ã®åŸã«è¿œå ãããŸãããããŠã CMD ã䜿ã£ãŠæå®ããå
šãŠã®èŠçŽ ã¯äžæžããããŸããããã«ããã docker run <ã€ã¡ãŒãž> -d ã§ã¯ããšã³ããªãŒãã€ã³ãã«å¯ŸããŠåŒæ° -d ãæž¡ããŸãããŸãã ENTRYPOINT åœä»€ã®äžæžãã¯ã docker run --entrypoint ãã©ã°ã䜿ããŸãã
shell 圢åŒã§ã¯ã CMD ã run ã³ãã³ãã©ã€ã³ã®åŒæ°ã䜿ããŸããã ENTRYPOINT 㯠/bin/sh -c ã®ãµãã³ãã³ããšããŠèµ·åããããããã·ã°ãã«ãæž¡ããŸããããã®ãããå®è¡ãã¡ã€ã«ã¯ã³ã³ããã® PID 1 ã§ã¯ãªããUnix ã·ã°ãã«ãåä¿¡ã§ããŸãããã€ãŸãã docker stop <ã³ã³ããå> ãå®è¡ããŠããå®è¡ãã¡ã€ã«ã¯ SIGTERM ã·ã°ãã«ãåä¿¡ããŸããã
ENTRYPOINT ãè€æ°æžããŠããDockerfile äžã§äžçªæåŸã® åœä»€ããåŠçãããŸããã
exec 圢åŒã® ENTRYPOINT äŸÂ¶
ENTRYPOINT ã® exec 圢åŒã¯ã確å®ã«å®è¡ããããã©ã«ãã®ã³ãã³ããšåŒæ°ãèšå®ããããã«äœ¿ããŸãããããŠã CMD ã®ã©ã¡ããã®åœ¢åŒã䜿ããå€ããå¯èœæ§ãããããã©ã«ãïŒã®ãã©ã¡ãŒã¿ãåŒæ°ïŒãæå®ããŸãã
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
ãã®ã³ã³ãããå®è¡ãããšãå¯äžã®ããã»ã¹ãšã㊠top ãèŠããŸãã
$ docker run -it --rm --name test top -H
top - 08:25:00 up 7:27, 0 users, load average: 0.00, 0.01, 0.05
Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 2056668 total, 1616832 used, 439836 free, 99352 buffers
KiB Swap: 1441840 total, 0 used, 1441840 free. 1324440 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19744 2336 2080 R 0.0 0.1 0:00.04 top
ããã«è©³ãã調ã¹ãã«ã¯ã docker exec ã䜿ããŸãã
$ docker exec -it test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.6 0.1 19752 2352 ? Ss+ 08:24 0:00 top -b -H
root 7 0.0 0.1 15572 2164 ? R+ 08:25 0:00 ps aux
top ãé©åã«çµäºããã«ã¯ãdocker stop test ãå®è¡ããŸãã
以äžã® Dockerfile ã¯ãApache ããã©ã¢ã°ã©ãŠã³ãã§å®è¡ããããã«ïŒã€ãŸãã PID 1 ãšããŠïŒ ENTRYPOINT ã䜿ããŸãã
FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
å®è¡ãã¡ã€ã«ã® exec ãš gosu ã³ãã³ãã䜿ããŸãã
#!/usr/bin/env bash
set -e
if [ "$1" = 'postgres' ]; then
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
gosu postgres initdb
fi
exec gosu postgres "$@"
fi
exec "$@"
æåŸã«ã ENTRYPOINT ã¹ã¯ãªããã Unix ã·ã°ãã«ãåä¿¡ããç¶ããŠãä»ã®åŠçãè¡ãããã«ããå¿
èŠããããŸãã
#!/bin/sh
# ã¡ã¢ïŒsh ã§ã¹ã¯ãªãããæžãããããbuxybox ã³ã³ãããåäœãã
# ãµãŒãã¹ã®åæ¢åŸã«ãå¿
èŠãããã°æåã§ã¯ãªãŒã³ã¢ããã§ããããã«ããå Žåãã
# 1ã€ã®ã³ã³ããå
ã§è€æ°ã®ãµãŒãã¹ãèµ·åã§ããããã«ããå Žåã«ã¯ããã©ããã䜿ã
trap "echo TRAPed signal" HUP INT QUIT TERM
# ããã§ã¯ãããã¯ã°ã©ãŠã³ãã§ãµãŒãã¹ãèµ·å
/usr/sbin/apachectl start
echo "[hit enter key to exit] or run 'docker stop <container>'"
read
# ããã§ã¯ããµãŒãã¹ã®åæ¢ãšã¯ãªãŒã³ã¢ãã
echo "stopping apache"
/usr/sbin/apachectl stop
echo "exited $0"
ãã®ã€ã¡ãŒãžã docker run -it --rm -p 80:80 --name test apache ã§å®è¡ãããšã以åŸã docker exec ã docker top ã§ã³ã³ããã®ããã»ã¹ã確èªã§ããŸãããã®åŸãApache ã
$ docker exec -it test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 4448 692 ? Ss+ 00:42 0:00 /bin/sh /run.sh 123 cmd cmd2
root 19 0.0 0.2 71304 4440 ? Ss 00:42 0:00 /usr/sbin/apache2 -k start
www-data 20 0.2 0.2 360468 6004 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start
www-data 21 0.2 0.2 360468 6000 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start
root 81 0.0 0.1 15572 2140 ? R+ 00:44 0:00 ps aux
$ docker top test
PID USER COMMAND
10035 root {run.sh} /bin/sh /run.sh 123 cmd cmd2
10054 root /usr/sbin/apache2 -k start
10055 33 /usr/sbin/apache2 -k start
10056 33 /usr/sbin/apache2 -k start
$ /usr/bin/time docker stop test
test
real 0m 0.27s
user 0m 0.03s
sys 0m 0.03s
泚é
ENTRYPOINT èšå®ã¯ --entrypoint ã䜿ã£ãŠäžæžãã§ããŸããããããããã§ã®èšå®ã¯ãå®è¡ãã¡ã€ã«ãšããŠã® sh -c ã¯äœ¿ããŸããïŒã
泚é
exec 圢åŒã¯ JSON é åãšããŠè§£éãããŸãã®ã§ãåèªãå²ãã«ã¯ã·ã³ã°ã«ã¯ãªãŒãïŒ'ïŒã§ã¯ãªãããã«ã¯ãªãŒãïŒ"ïŒã䜿ãå¿ èŠããããŸãã
ã·ã§ã« 圢åŒãšã¯ç°ãªãã exec 圢åŒã¯ã³ãã³ãã·ã§ã«ãåŒã³åºããŸãããã€ãŸããéåžžã®ã·ã§ã«ãšããŠã®åŠçãèµ·ãããªãã®ãæå³ããŸããããšãã°ã ENTRYPOINT [ "echo", "$HOME" ] ã§ã¯ã $HOME ã倿°å±éããŸãããã·ã§ã«ãšããŠã®åŠçãè¡ãããå Žåã«ã¯ã ã·ã§ã« 圢åŒã䜿ããã ENTRYPOINT [ "sh", "-c", "echo $HOME" ] ã®ããã«ã·ã§ã«ãçŽæ¥å®è¡ããŸããexec 圢åŒã䜿ã£ãŠçŽæ¥ã·ã§ã«ãå®è¡ããå Žåã¯ãã·ã§ã«åœ¢åŒã®å Žåãšåæ§ã«ãç°å¢å€æ°ã®å±éãããã®ã¯ã·ã§ã«ã§ããã Docker ã§ã¯ãããŸããã
ã·ã§ã«åœ¢åŒã® ENTRYPOINT äŸÂ¶
åã«æååã ENTRYPOINT ã§æå®ããã ãã§ã /bin/sh -c ã®äžã§å®è¡ã§ããŸãããã®åœ¢åŒã§ã¯ãç°å¢å€æ°ãå±éããããã«ã·ã§ã«ã®åŠçã䜿ããŸãããããŠã CMD ã docker run ã³ãã³ãã©ã€ã³ã§ã®åŒæ°ã¯ç¡èŠãããŸããé·æã«å®è¡ããŠãã ENTRYPOINT ã®å®è¡ãã€ããªã«å¯Ÿãã docker stop ã§é©åã«ã·ã°ãã«ãéãã«ã¯ã exec ã§èµ·åããå¿
èŠãããã®ã念é ã«çœ®ããŠãã ããã
FROM ubuntu
ENTRYPOINT exec top -b
ãã®ã€ã¡ãŒãžã§å®è¡ãããšã PID 1 ã®ããã»ã¹ã1ã€èŠããŸãã
$ docker run -it --rm --name test top
Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached
CPU: 5% usr 0% sys 0% nic 94% idle 0% io 0% irq 0% sirq
Load average: 0.08 0.03 0.05 2/98 6
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
1 0 root R 3164 0% 0% top -b
docker stop ã§ã¯ãªãŒã³ã«çµäºããŸãã
$ /usr/bin/time docker stop test
test
real 0m 0.20s
user 0m 0.02s
sys 0m 0.04s
ä»®ã«ã ENTRYPOINT ã®ã¯ããã« exec ã远å ãå¿ãããšããŸãã
FROM ubuntu
ENTRYPOINT top -b
CMD --ignored-param1
ãããŠãããã䜿ã£ãŠèµ·åããŸãïŒæå®ããååã¯æ¬¡ã®ã¹ãããã§äœ¿ããŸãïŒã
$ docker run -it --name test top --ignored-param2
Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached
CPU: 9% usr 2% sys 0% nic 88% idle 0% io 0% irq 0% sirq
Load average: 0.01 0.02 0.05 2/101 7
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
1 0 root S 3168 0% 0% /bin/sh -c top -b cmd cmd2
7 1 root R 3164 0% 0% top -b
top ã®åºåããã ENTRYPOINT ã®æå®ãããã®ã PID 1 ã§ã¯ãªãã®ãåãããŸãã
docker stop test ãå®è¡ããŠããã³ã³ããã¯ãããã«çµäºããŸããã stop ã³ãã³ãã¯ã¿ã€ã ã¢ãŠãåŸã« SIGKILL ã匷å¶éä¿¡ããããã§ãã
$ docker exec -it test ps aux
PID USER COMMAND
1 root /bin/sh -c top -b cmd cmd2
7 root top -b
8 root ps aux
$ /usr/bin/time docker stop test
test
real 0m 10.19s
user 0m 0.04s
sys 0m 0.03s
CMD ãš ENTRYPOINT ã®é£æºãç解¶
CMD ãš ENTRYPOINT åœä»€ã¯ãã©ã¡ããã³ã³ããèµ·åæã«äœã®ã³ãã³ããå®è¡ãããå®çŸ©ããŸããåœä»€ãæžãã«ããããäž¡æ¹ã飿ºããã«ã¯ãããã€ãã®ã«ãŒã«ããããŸãã
Dockerfile ã¯ãå°ãªããšã1ã€ã®
CMDãENTRYPOINTåœä»€ãæžãã¹ãã§ããENTRYPOINTã¯ãã³ã³ãããå®è¡ãã€ã㪠ã®ããã«æ±ãããå Žåã«å®çŸ©ãã¹ãã§ããCMDã¯ãENTRYPOINTã³ãã³ãã«å¯Ÿããããã©ã«ãã®åŒæ°ãå®çŸ©ãããããããã³ã³ããå ã§ãã®å Žãã®å Žã§ã³ãã³ããå®è¡ããããã«äœ¿ãã¹ãã§ããCMDã¯ãã³ã³ããã®å®è¡æã«ãã»ãã®åŒæ°ã§äžæžããããå ŽåããããŸãã
以äžã®è¡šã¯ã ENTRYPOINT ãš CMD ã®çµã¿åããã§ãã©ã®ãããªåŠçãè¡ããããã瀺ããŸãã
ENTRYPOINT ãªã |
ENTRYPOINT exec_entry p1_entry |
ENTRYPOINT [âexec_entryâ, âp1_entryâ] |
|
|---|---|---|---|
CMD ãªã |
ãšã©ãŒãå®è¡ã§ããªãã |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry |
CMD [âexec_cmdâ, âp1_cmdâ] |
exec_cmd p1_cmd |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry exec_cmd p1_cmd |
CMD [âp1_cmdâ, âp2_cmdâ] |
p1_cmd p2_cmd |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry p1_cmd p2_cmd |
CMD exec_cmd p1_cmd |
/bin/sh -c exec_cmd p1_cmd |
/bin/sh -c exec_entry p1_entry |
exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd |
泚é
ããŒã¹ã»ã€ã¡ãŒãžã§ CMD ãå®çŸ©ãããŠããå Žåã§ãã ENTRYPOINT ã®èšå®ã«ãã£ãŠ CMD ã¯ç©ºã®å€ã«ãªã»ãããããŸãããã®ãããªå Žåã¯ãçŸåšã®ã€ã¡ãŒãžã§äœããã®å€ãæã€ããã«ã CMD ãå®çŸ©ããå¿
èŠããããŸãã
VOLUME¶
VOLUME ["/data"]
VOLUME åœä»€ã¯ãæå®ããååã§ VOLUME ["/var/log/"] ã®ãã㪠JSON é
åãã VOLUME /var/log ã VOLUME /var/log /var/db ã®ãããªè€æ°ã®åŒæ°ãæã€åãªãæååã§ãã詳ããæ
å ±ããµã³ãã«ãDocker ã¯ã©ã€ã¢ã³ããçµç±ããŠããŠã³ãããæ¹æ³ã¯ ããªã¥ãŒã ãéãããã£ã¬ã¯ããªå
±æ ãåç
§ãã ããã
docker run åœä»€ã¯ãããŒã¹ã»ã€ã¡ãŒãžå
ã§æå®ããå Žæã«äœãããŒã¿ããã£ãŠãããããæ°èŠã«äœæããããªã¥ãŒã ãšããŠåæåããŸããäŸãã°ã次ã®ãã㪠Dockerfile ã®æç²ã§èããŸãã
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
ãã® Dockerfile ã§ docker run ã«ãã£ãŠäœæãããã€ã¡ãŒãžãšã¯ãæ°ããããŠã³ããã€ã³ãã /myvol ãžäœæããïŒãã®å Žæã«ãã£ãïŒ greeting ãã¡ã€ã«ãæ°èŠäœæããããªã¥ãŒã ãžã³ããŒããŸãã
ããªã¥ãŒã æå®ã«ã€ããŠã®æ³šæÂ¶
Dockerfile å
ã§ã®ããªã¥ãŒã ã®æ±ãã«ã€ããŠã¯ã以äžã®ç¹ã«æ³šæããŠãã ããã
Windows ããŒã¹ã®ã³ã³ããäžã®ããªã¥ãŒã ïŒ Windows ããŒã¹ã®ã³ã³ãããå©çšããå Žåãã³ã³ããå ã§ã®ããªã¥ãŒã æå®å ã¯ã次ã®ã©ã¡ããã®å¿ èŠããããŸãã
ååšããŠããªããã£ã¬ã¯ããªããŸãã¯ã空ã®ãã£ã¬ã¯ããª
C ãã©ã€ã以å€
Dockerfile å ããã®ããªã¥ãŒã å€æŽ ïŒããªã¥ãŒã ã宣èšåŸãæ§ç¯ã¹ãããã§ããªã¥ãŒã å ã®ããŒã¿ã«å¯Ÿãã倿Žããã£ããšããŠãããããã®å€æŽã¯ç Žæ£ãããŸãïŒåæ ãããŸããïŒã
JSON åœ¢åŒ ïŒåŒæ°ãªã¹ã㯠JSON é åãšããŠæ±ãããŸããæåãå²ãã«ã¯ã·ã³ã°ã«ã»ã¯ã©ãŒãïŒ
'ïŒã§ã¯ãªãããã«ã»ã¯ã©ãŒãïŒ"ïŒã䜿ãå¿ èŠããããŸããã³ã³ããå®è¡æã«å®£èšããããã¹ãåŽãã£ã¬ã¯ã㪠ïŒ
ãã¹ãåŽãã£ã¬ã¯ã㪠ïŒããŠã³ããã€ã³ãïŒã¯ããã®æ§è³ªäžããã¹ãã«äŸåããŸããããã¯ã€ã¡ãŒãžã®ç§»æ€æ§ãç¶æããããã§ãããæå®å¯Ÿè±¡ã®ãã¹ãåŽãã£ã¬ã¯ããªããå šãŠã®ãã¹ãäžã§å©çšå¯èœã§ããä¿èšŒããªãããã§ãããã®çç±ã«ãããDockerfile å ãããã¹ãåŽãã£ã¬ã¯ããªãããŠã³ãã§ããŸãããVOLUMEåœä»€ã¯ãäžåã®ãã¹ãåŽãã£ã¬ã¯ããªã«å¯Ÿãããã©ã¡ãŒã¿æå®ããµããŒãããŸãããïŒãã¹ãåŽãæå®ããå¿ èŠãããå Žåã¯ïŒã³ã³ããã®å®è¡æãäœææã«ãããŠã³ããã€ã³ããæå®ããªããŠã¯ãããŸããã
USER¶
USER <ãŠãŒã¶>[:<ã°ã«ãŒã>]
ãŸãã¯
USER <UID>[:<GID>]
泚é
ãŠãŒã¶ã«å¯ŸããŠã°ã«ãŒããæå®ããå Žåããã®ãŠãŒã¶ã¯æå®ããã°ã«ãŒãã«ãã®ã¿ãæå±ããŸãã®ã§æ³šæããŠãã ãããä»ã®ã°ã«ãŒãæå±ã®èšå®ã¯ç¡èŠãããŸãã
èŠå
ãŠãŒã¶ã«å¯ŸããŠæå±ã°ã«ãŒãã®æå®ãç¡ããã°ãã€ã¡ãŒãžïŒãŸãã¯ä»¥éã®åœä»€ïŒã®å®è¡æã« root ã°ã«ãŒããšããŠå®è¡ãããŸãã
Windows ã§ã¯ããŸããåæã«äœææžã¿ã§ã¯ãªããŠãŒã¶ãäœæãå¿
èŠã§ãããããããã«ã¯ã Dockerfile ã§ net user ã³ãã³ãã䜿ãå¿
èŠããããŸãã
FROM microsoft/windowsservercore
# ã³ã³ããå
ã§ Windows ãŠãŒã¶ãäœæ
RUN net user /add patrick
# 次ã®ã³ãã³ããæå®
USER patrick
WORKDIR¶
WORKDIR /path/to/workdir
WORKDIR åœä»€ã¯ãDockerfile å
ã§ä»¥éã«ç¶ã RUN ã CMD ã ENTRYPOINT ã COPY ã ADD åœä»€ã®åŠçæã«ïŒã³ãã³ããå®è¡ããå ŽæãšããŠïŒäœ¿ã WORKDIR ãååšããŠããªããã°äœæãããŸããããã¯ã以éã® Dockerfile ã§äœ¿ãããªããŠãã§ãã
WORKDIR åœä»€ã¯ Dockerifle å
ã§äœåºŠãå©çšã§ããŸããçžå¯Ÿãã¹ãæå®ãããšããã®åã® WORKDIR åœä»€ã§æå®ãããå Žæã«å¯Ÿããçžå¯Ÿãã¹ã«ãªããŸãã
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
ãã® Dockerfile ã§ãæåŸã® pwd ã³ãã³ãã®åºå㯠/a/b/c ã«ãªããŸãã
WORKDIR åœä»€ã¯ã ENV åœä»€ã§èšå®æžã¿ã®ç°å¢å€æ°ãå±éã§ããŸããå©çšã§ããç°å¢å€æ°ã¯ã Dockerfile ã§æç€ºãããã®ã ãã§ããäŸïŒ
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
ãã® Dockerfile ã§ã¯ãæåŸã® pwd ã³ãã³ãã®åºå㯠/path/$DIRNAME ã«ãªããŸãã
ARG¶
ARG <åå>[=<ããã©ã«ãå€>]
ARG åœä»€ã¯ docker build ã³ãã³ãã§ --build-arg <倿°å>=<å€> ãæå®ããŸãããããããŠãŒã¶ãæ§ç¯æã«åŒæ°ãæå®ããŠãã Dockerfile äžã§æå®ãç¡ããã°ãæ§ç¯æã«èŠåãåºãŸãã
[Warning] One or more build-args [foo] were not consumed.
ïŒ[èŠå] build-arg [foo] ã¯äœ¿ãããŸããã§ããïŒ
Dockerfile ã«1ã€ãŸãã¯è€æ°ã® ARG åœä»€ãå
¥ããããŸããããšãã°ã以äžã¯æ£ãã Dockerfile ã§ãã
FROM busybox
ARG user1
ARG buildno
# ...
èŠå
GitHub ããŒããŠãŒã¶ã®èªèšŒæ
å ±ã®ãã㪠docker history ã³ãã³ãã䜿ãã°ãæ§ç¯æã®å€æ°ã衚瀺ã§ããããã§ãã
ã€ã¡ãŒãžæ§ç¯æã«æ©åŸ®æ å ±ïŒã·ãŒã¯ã¬ããïŒãå®å šã«äœ¿ãæ¹æ³ãåŠã¶ã«ã¯ã BuildKit ã§ã€ã¡ãŒãžãæ§ç¯ ãã芧ãã ããã
ããã©ã«ãã®å€Â¶
ãªãã·ã§ã³ã§ãARG åœä»€ã«ããã©ã«ãå€ãæå®ã§ããŸãã
FROM busybox
ARG user1=someuser
ARG buildno=1
...
ãã ARG åœä»€ã«ããã©ã«ãå€ããããæ§ç¯æã«å€ã®æå®ãç¡ããã°ããã«ããŒã¯ããã©ã«ãå€ã䜿ããŸãã
倿°ã®ç¯å²Â¶
ARG 倿°ã®å®çŸ©ãæå¹ã«ãªãã®ã¯ã Dockerfile ã§å®çŸ©ãããåŸã®è¡ã§ãããã³ãã³ãã©ã€ã³äžãªã©ã§ã®åŒæ°ã§ã¯ãããŸãããããšãã°ããã®ãã㪠Dockerfile ãäŸã«èããŸãããã
FROM busybox
USER ${user:-some_user}
ARG user
USER $user
...
ãã®ãã¡ã€ã«ã䜿ã£ãŠæ§ç¯ããã«ã¯ã次ã®ã³ãã³ããå®è¡ãããšããŸãã
$ docker build --build-arg user=what_user .
æ§ç¯æãã³ãã³ãã©ã€ã³ã®åŒæ°ã§å€æ°ã®å€ãæå®ããŠããŠãã ARG åœä»€ã§å€æ°ãå®çŸ©ãããŸã§ã¯ããã®å€æ°ã®å€ã¯ç©ºçœã®æååãšããŠæ±ãããŸãã2è¡ç®ã® USER åœä»€ã¯ããã®æç¹ã§ã¯å€æ° $user ã«å¯Ÿããå€ãå®çŸ©ãããŠããªãããã倿° $user ã®å€ã¯ some_user ãšããŠåŠçãããŸãïŒã·ã§ã«ãªã©ã®å€æ°å±éãšåãã§ã ${user:-some_user} ã¯ã倿° $user ã®å€ãæªå®çŸ©ã§ããã°ã some_user ãå€ã«å
¥ããåŠçã§ã ïŒãç¶ã3è¡ç®ã® ARG åœä»€ã«ãããã³ãã³ãã©ã€ã³ã§æå®ããåŒæ° what_user ãã倿° $user ã«å¯Ÿããå€ãšããŠèšå®ãããŸãããããŠã4è¡ç®ã® USER åœä»€ã§äœ¿ãããŠãã $user 㯠what_user ã«ãªããŸãã
ARG åœä»€ãæå¹ãªç¯å²ã¯ãæ§ç¯ã¹ããŒãžã®å®çŸ©ãçµãããŸã§ã§ããè€æ°ã®ã¹ããŒãžã§ ARG åœä»€ãå¿
èŠã§ãã
FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS
FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS
ARG ã§å€æ°ã䜿ãã«ã¯Â¶
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER v1.0.0
RUN echo $CONT_IMG_VER
ãããŠã次ã®ã³ãã³ãã§ã€ã¡ãŒãžãäœã£ããšããŸãããã
$ docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile
ãã®å Žåã RUN åœä»€ã§äœ¿ãããå€ã¯ããŠãŒã¶ãïŒã³ãã³ãã©ã€ã³ã§ïŒæå®ãã ARG åœä»€ã®å€ v2.0.1 ã§ã¯ãªã v1.0.0 ã§ããããã¯ãã·ã§ã«ã¹ã¯ãªããã®æåã«äŒŒãŠããŸããå®çŸ©ããæç¹ããã
å
ã»ã©ã®äŸãšéã ENV 仿§ã䜿ãã°ã ARG åœä»€ãš ENV åœä»€ã®éã§ããã圹ç«ã€çžäºé¢ä¿ãäœããŸãã
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
ARG åœä»€ãšã¯éãã ENV ã®å€ã¯åžžã«æ§ç¯ã€ã¡ãŒãžå
ã«ä¿æãããŸãã --build-arg ãã©ã°ããªã docker build ãèããŸãã
$ docker build .
ãã® Dockerfile äŸã䜿ããšã ïŒdocker build æã«åŒæ°ã®æå®ããªãã£ãããïŒ3è¡ç®ã® ENV åœä»€ã«ãã£ãŠããã©ã«ãã® v1.0.0 ã倿° CONT_IMG_VER ã®å€ãšãªãããã®å€ãã€ã¡ãŒãžå
ã§ãã£ãšä¿æãããŸãã
ä»åã®äŸã«ãã倿°å±éã®ææ³ã«ãã£ãŠãã³ãã³ãã©ã€ã³ããåŒæ°ãæž¡ãã ENV åœä»€ãå©çšããŠæçµçãªã€ã¡ãŒãžãŸã§ä¿æã§ããŸãããªãã倿°å±éããµããŒãããŠããã®ã¯ã Dockerfile åœä»€ã®äžéš ã®ã¿ã§ãã
å®çŸ©æžã¿ã® ARG 倿°Â¶
Docker ã«ã¯ãDockerfile å
ã§å¯Ÿå¿ãã ARG åœä»€ã䜿ããªããŠãå©çšã§ãã ARG 倿°ããããŸãã
HTTP_PROXYhttp_proxyHTTPS_PROXYhttps_proxyFTP_PROXYftp_proxyNO_PROXYno_proxy
ãããã®å€æ°ã䜿ãã«ã¯ãã³ãã³ãã©ã€ã³äžã® --build-arg ãã©ã°ã§æž¡ããŸãã
$ docker build --build-arg CONT_IMG_VER=v2.0.1 .
ããã©ã«ãã§ã¯ããããã®å®çŸ©æžã¿å€æ°ã¯ docker history ã®åºåããé€å€ãããŸããããããé€å€ããããšã§ã HTTP_PROXY 倿°ã®ãããªæ©åŸ®æ
å ±ãæŒæŽ©ããå±éºæ§ãæžãããŸãã
ããšãã°ã次㮠Dockerifle ã䜿ãã --build-arg HTTP_PROXY=http://user:pass@proxy.lon.example.com ã§æ§ç¯ããäŸãèããŸãã
FROM ubuntu
RUN echo "Hello World"
ãããããšã HTTP_PROXY 倿°ã®å€ã¯ docker history ã§èŠããªããªãããã£ãã·ã¥ããããŸããããããããããã·ãµãŒãã®å Žæã http://user:pass@proxy.sfo.example.com ã«å€ãã£ããšããŠãã以åŸã®æ§ç¯ã§ïŒèª€ã£ãæ
å ±ãïŒãã£ãã·ã¥ããããšã«ããæ§ç¯å€±æããããŸããã
ãã®ãããªæåãäžæžããããå Žåã¯ã次㮠Dockerfile ã®ãã㪠ARG åœä»€ã远å ããŸãã
FROM ubuntu
ARG HTTP_PROXY
RUN echo "Hello World"
ãã® Dockerfile ã§æ§ç¯ãããšã HTTP_PROXY 㯠docker history ïŒã§èŠããããã«ïŒä¿åããããã®å€ã倿Žãããšæ§ç¯ãã£ãã·ã¥ã¯ç¡å¹åãããŸãã
ã°ããŒãã«ç¯å²ã§ã®èªåçãªãã©ãããã©ãŒã ARG 倿°Â¶
ãã®æ©èœãå©çšã§ããã®ã¯ã BuildKit ããã¯ãšã³ããå©çšããæã®ã¿ã§ãã
æ§ç¯ãåŠçããããŒãïŒ ARG 倿°ãšããŠå®çŸ©æžã¿ã§ããã¿ãŒã²ããã»ãã©ãããã©ãŒã 㯠docker build ã® --platform ãã©ã°ã§æå®ã§ããŸãã
以äžã® ARG 倿°ã¯èªåçã«èšå®ãããŸãã
TARGETPLATFORMâŠæ§ç¯å¯Ÿè±¡ ã®ãã©ãããã©ãŒã ãäŸïŒlinux/amd64ãlinux/arm/v7ãwindows/amd64TARGETOS⊠TARGETPLATFORM ã® OS ã³ã³ããŒãã³ãTARGETARCH⊠TARGETPLATFORM ã®ã¢ãŒããã¯ãã£ã»ã³ã³ããŒãã³ãTARGETVARIANT⊠TARGETPLATFORM ã®æŽŸçã³ã³ããŒãã³ãBUILDPLATFORM⊠æ§ç¯ãåŠçããããŒãã®ãã©ãããã©ãŒãBUILDOS⊠BUILDPLATFORM ã® OS ã³ã³ããŒãã³ãBUILDARCH⊠BUILDPLATFORM ã®ã¢ãŒããã¯ãã£ã»ã³ã³ããŒãã³ãBUILDVARIANT⊠BUILDPLATFORM ã®æŽŸçã³ã³ããŒãã³ã
ãããã®åŒæ°ã¯ã°ããŒãã« RUN ã³ãã³ãããèªåçã«å©çšã§ããŸããããããã®åŒæ°ãæ§ç¯ã¹ããŒãžã®äžã§å©çšããã«ã¯ãå€ãªãã§å®çŸ©ããŸãã
äŸïŒ
FROM alpine
ARG TARGETPLATFORM
RUN echo "I'm building for $TARGETPLATFORM"
æ§ç¯ãã£ãã·ã¥ãžã®åœ±é¿Â¶
ARG 倿°ã¯ ENV 倿°ãšç°ãªããæ§ç¯ã€ã¡ãŒãžå
ã«ä¿æãããŸãããããããªããã ARG 倿°ãïŒ ENV ãšïŒåãããã«æ§ç¯ãã£ãã·ã¥ã«åœ±é¿ãäžããŸããããšãã°ã Dockerfile ã§ä»¥åã«æ§ç¯ããããã®ãšç°ãªã ARG 倿°ãå®çŸ©ãããå Žåã¯ãå®çŸ©ãã©ãã§ããããšãçã£å
ã«ã RUN åœä»€ã¯ ARG åœä»€ã§æå®ããã ARG 倿°ãèªåçã«ïŒç°å¢å€æ°ãšããŠïŒæ±ããŸããã€ãŸããããã«ãã£ãŠå€±æãçºçããå¯èœæ§ããããŸããå
šãŠã®å®çŸ©æžã¿ ARG 倿°ã¯ã Dockerfile å
ã§äžèŽãã ARG åœä»€ããªããã°ããã£ãã·ã¥ããé€å€ãããŸãã
ããšãã°ãããã2ã€ã® Dockerfile ã§èããŸãããã
FROM ubuntu
ARG CONT_IMG_VER
RUN echo $CONT_IMG_VER
FROM ubuntu
ARG CONT_IMG_VER
RUN echo hello
ã³ãã³ãã©ã€ã³ã§ --build-arg CONT_IMG_VER=<å€> ãæå®ãããšãã©ã¡ãã®å Žåã2è¡ç®ãŸã§ã¯ãã£ãã·ã¥å€±æã¯çºçããã3è¡ç®ã§å€±æãçºçããŸãã ARG CONT_IMG_VER ã«ãã£ãŠã RUN è¡ã CONT_IMG_VER=<value> echo hello ãšããŠå®è¡ããããã«å®çŸ©ããã®ãšåãã§ããã€ãŸãã <å€> ãå€ãã£ãããããã£ãã·ã¥ã«å€±æããŸãã
åãã³ãã³ãã©ã€ã³ã§ãå¥ã®äŸãèããŸãã
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=$CONT_IMG_VER
RUN echo $CONT_IMG_VER
ãã®äŸã§ã¯ã3è¡ç®ã§ãã£ãã·ã¥ã«å€±æããŸãã倱æããã®ã¯ã ENV ã«ãã倿°ã®å€ã ARG 倿°ãåç
§ãããã€ããã®å€æ°ãã³ãã³ãã©ã€ã³ãéããŠå€æŽãããããã§ãããã®äŸã§ã¯ã ENV åœä»€ã«ãã£ãŠã€ã¡ãŒãžã®äžã«å€ãå«ãŸããŸãã
ENV åœä»€ããåãååã® ARG ã§äžæžãããå Žåã¯ã次ã®ãã㪠Dockerifle ã«ãªããŸãã
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=hello
RUN echo $CONT_IMG_VER
3è¡ç®ã® CONT_IMG_VER å€ã¯å®æ°ïŒ hello ïŒã®ããããã£ãã·ã¥å€±æã¯çºçããŸãããçµæãšããŠã RUN ïŒ4è¡ç®ïŒã§äœ¿ãããç°å¢å€æ°ãšå€ã¯ãæ§ç¯ã®éã¯å€ãããŸããã
ONBUILD¶
ONBUILD [åœä»€]
ONBUILD åœä»€ã¯ãåŸããä»ã®ã€ã¡ãŒãžæ§ç¯ã®åºç€ïŒããŒã¹ïŒãšããŠäœ¿ãããæã«ãã Dockerfile ã«ãã FROM åœä»€ã®çŽåŸã«ãçŽã¡ã«å®è¡ãããŸãã
ããããæ§ç¯åœä»€ãããªã¬ãšããŠç»é²ã§ããŸãã
ä»ã®ã€ã¡ãŒãžãæ§ç¯ããæã«ããã®åºç€ãšãªãã€ã¡ãŒãžãæ§ç¯ããã®ã«åœ¹ç«ã¡ãŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ç°å¢ãããŠãŒã¶åºæã®èšå®ã§ã«ã¹ã¿ãã€ãºå¯èœãªããŒã¢ã³ã§ãã
ããšãã°ãã€ã¡ãŒãžãåå©çšå¯èœãª Python ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ãããã®ïŒãã«ãïŒã§ããã°ãç¹å®ã®ãã£ã¬ã¯ããªã«å¯ŸããŠã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã远å ããå¿
èŠããããããã«ãåŸããæ§ç¯çšã¹ã¯ãªãããåŒã³åºãå¿
èŠãããå Žåãããã§ãããããã®æç¹ã§ã¯ ADD ãš RUN åœä»€ãåŒã³åºããŸããããªããªãããŸã ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ãããããã«ãã¢ããªã±ãŒã·ã§ã³ããšã«ãœãŒã¹ã³ãŒããç°ãªãããã§ãããããã·ã³ãã«ã«å®çŸããã«ã¯ãã¢ããªã±ãŒã·ã§ã³éçºè
ããã³ãã¬ãŒããšãªã Dockerfile ãã¢ããªã±ãŒã·ã§ã³ããšã«ã³ããŒïŒããŒã¹ãããæ¹æ³ããããŸãããããããã¯ãã¢ããªã±ãŒã·ã§ã³åºæã®ã³ãŒããæ··åšãããšãå¹çãæªãããšã©ãŒãçºçããã¡ã§ãããæŽæ°ãå°é£ã§ãã
ãã®è§£æ±ºç㯠ONBUILD åœä»€ã䜿ããæ¬¡ã®æ§ç¯ã¹ããŒãžäžã«ãåŸã§å®è¡ããé«åºŠãªåœä»€ãç»é²ããŸãã
ããã¯ã次ã®ããã«åäœããŸãïŒ
ONBUILDåœä»€ãçºçãããšããã«ããŒã¯æ§ç¯äžã®ã€ã¡ãŒãžå ã«ãããªã¬ãã¡ã¿ããŒã¿ãšããŠè¿œå ããŸããçŸæç¹ã§ã®æ§ç¯ã§ã¯ããã®åœä»€ã¯äœã圱é¿ãäžããŸãããæ§ç¯åŸããã¹ãŠã®ããªã¬äžèЧã¯ãã€ã¡ãŒãžã®ãããã§ã¹ã
OnBuildããŒä»¥äžã«ä¿ç®¡ãããŸãããããã¯docker inspectã³ãã³ãã§èª¿ã¹ãããŸããåŸã»ã©ããã®ã€ã¡ãŒãžãæ°ããæ§ç¯ã®ããŒã¹ãšããŠçšããããã
FROMåœä»€ã§åŒã³åºãããã§ããããFROMåœä»€ã®åŠçã®äžéšãšããŠãããŠã³ã¹ããªãŒã ã®ãã«ããŒã¯ONBUILDããªã¬ãæ¢ããŸãããããŠãããªã¬ãç»é²ãããã®ãšåãé çªã§ãããªã¬ãå®è¡ããŸãããããããªã¬ã®1ã€ã§ã倱æãããšãFROMåœä»€ã¯åŠçãäžæ¢ãšãªããæ§ç¯ã¯å€±æããŸããå šãŠã®ããªã¬åŠçãæåãããšãFROMåœä»€ã¯å®äºãã以éã¯éåžžéãæ§ç¯ãé²è¡ããŸããæåŸã®åŠçãããã£ãåŸãæçµã€ã¡ãŒãžããããªã¬ã¯åé€ãããŸããèšãæãããšãã
å« ããã«ãã«ã¯ç¶æ¿ãããŸããã
ããšãã°ã次ã®ãããªè¿œå ãšãªãã§ãããã
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
èŠå
ONBUILD åœä»€ãã€ãªãã ONBUILD ONBUILD ãšããŠã¯äœ¿ããŸããã
èŠå
ONBUILD åœä»€ã¯ FROM ã MAINTAINER åœä»€ãããªã¬ã«ã§ããŸããã
STOPSIGNAL¶
STOPSIGNAL ä¿¡å·
STOPSIGNAL åœä»€ã¯ã SIGKILL ã®ãããªä¿¡å·åã®æžåŒã®
HEALTHCHECK¶
HEALTHCHECK åœä»€ã¯ïŒã€ã®åœ¢åŒããããŸãã
HEALTHCHECK [ãªãã·ã§ã³] CMD ã³ãã³ã(ã³ã³ããå éšã§ã³ãã³ããå®è¡ããã³ã³ããã®æ£åžžæ§ã確èª)HEALTHCHECK NONE(ããŒã¹ã€ã¡ãŒãžããããã«ã¹ãã§ãã¯èšå®ã®ç¶æ¿ãç¡å¹å)
HEALTHCHECK åœä»€ã¯ãDocker ã«å¯ŸããŠã³ã³ããã®ãã¹ãæ¹æ³ãäŒããã³ã³ãããåäœãç¶ããŠãããã©ãã確èªããŸããããã«ããããŠã§ããµãŒããªã©ã§ãµãŒãã®ããã»ã¹ãå®è¡äžã«ããããããç¡éã«ãŒãããŠè©°ãŸã£ãŠããããæ°ããæ¥ç¶ãåŠçã§ããªãã£ãããããããªåé¡ãæ€åºããŸãã
ã³ã³ããã§ starting ïŒèµ·åäžïŒã§ãããã«ã¹ãã§ãã¯ãæ£åžžã§ããã°ãïŒä»¥åã®ç¶æ³ã«ãããããïŒã¹ããŒã¿ã¹ã¯ healthy ïŒæ£åžžïŒã«ãªããŸããäœåºŠãé£ç¶ãã unhealthy ïŒé害çºçïŒã«ãªããŸãã
CMD ãããåã«æžããŠããªãã·ã§ã³ãæå®ã§ããŸãã
--interval=æé(ããã©ã«ã: 30s) â»ãã«ã¹ãã§ãã¯ã®éé--timeout=æé(ããã©ã«ã: 30s) â»ã¿ã€ã ã¢ãŠãã®é·ã--start-period=æé(ããã©ã«ã: 0s) â» éå§æã®éé--retries=(ããã©ã«ã: 3) â»ãªãã©ã€åæ°
ã³ã³ãããèµ·åããïŒééã§æå®ããïŒ interval ç§åŸã«ã1åç®ã®ãã«ã¹ãã§ãã¯ãå®è¡ããŸãããããããåã³ãã«ã¹ãã§ãã¯ãååã®ãã§ãã¯å®äºåŸããã interval ç§ãçµéããããšã«è¡ããŸãã
ä¿¡å·ãéä¿¡ããŠãã ã¿ã€ã ã¢ãŠã ç§ãŸã§åŠçã«æéãããã£ãŠããã°ããã§ãã¯ã«å€±æãããšã¿ãªãããŸãã
ã³ã³ããã«å¯Ÿãããã«ã¹ãã§ãã¯ã®å€±æãã retries ã§æå®ãããªãã©ã€åæ°ã«éãããšãã³ã³ãã㯠unhealthy ãšã¿ãªãããŸãã
ã³ã³ãããèµ·åã«å¿
èŠãªæéããåæåããæéãšã㊠start period ã§æå®ããŸãããã®æéäžã«
ããããæå®ã§ããã®ã¯ãDockerfile ã® HEALTHCHECK åœä»€ã®ã¿ã§ããè€æ°ã® HEALTHCHECK åœä»€ãããã°ãæåŸã®1ã€ã®ã¿æå¹ã§ãã
CMD ããŒã¯ãŒãã®åŸã«æžãã³ãã³ãã¯ãã·ã§ã«ã³ãã³ãïŒäŸïŒ HEALTHCHECK CMD /bin/check-running ïŒã exec é
åïŒä»ã® Dockerfile ã³ãã³ããšåæ§ã§ãã詳现㯠ENTRYPOINT ãã芧ãã ããïŒã®ã©ã¡ããäžæ¹ã䜿ããŸãã
ãã®ã³ãã³ãã®çµäºã¹ããŒã¿ã¹ãã察象ãšãªãã³ã³ããã®ãã«ã¹ã¹ããŒã¿ã¹ã«ãªããŸããå¯èœæ§ã®ããå€ã¯ã次ã®éãã§ãã
0:
æå ã³ã³ããã¯æ£åžž1:
é害 2:
äºçŽæžã¿ - ãã®çµäºã³ãŒãã¯äœ¿ããŸãã
ããšãã°ããŠã§ããµãŒãããµã€ãã®ã¡ã€ã³ããŒãžã3ç§ä»¥å ã«æäŸã§ãããã©ãããã5åããšã«ãã§ãã¯ããã«ã¯ãæ¬¡ã®æ§ã«ããŸãã
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
ãã«ã¹ãã§ãã¯ã®å€±ææã«èª¿æ»ïŒãããã°ïŒãããããããããã«ãã³ãã³ããæžã蟌ãã æšæºåºåãæšæºãšã©ãŒåºåãšãã£ããããããåºåæåïŒUTF-8 ãšã³ã³ãŒãæ¹åŒïŒããã«ã¹ã¹ããŒã¿ã¹ã«ä¿åãããããã㯠docker inspect ã§èª¿ã¹ãããŸãããã®åºåã¯çãä¿ãããŸãïŒåããã 4096 ãã€ãã®ã¿ä¿åããŸãïŒã
ã³ã³ããã®ãã«ã¹ã¹ããŒã¿ã¹ãå€ããã°ãæ°ããã¹ããŒã¿ã¹ã§ health_status ã€ãã³ããäœæãããŸãã
SHELL¶
SHELL ["å®è¡ãã¡ã€ã«", "ãã©ã¡ãŒã¿"]
SHELL åœä»€ã¯ã ã·ã§ã« 圢åŒã§äœ¿ãããããã©ã«ãã®ã³ãã³ããäžæžãã§ããŸãã Linux äžã§ã®ããã©ã«ãã®ã·ã§ã«ã¯ ["/bin/sh", "-c"] ã§ãWindows 㯠["cmd", "/S", "/C"] ã§ããDockerfile ã§ã¯ã SHELL åœä»€ã JSON 圢åŒã§æžãå¿
èŠããããŸãã
Windows äžã§ã¯ç¹ã« SHELL åœä»€ã圹ç«ã¡ãŸããããã¯ãäžè¬çã«äœ¿ãããã·ã§ã«ã cmd ãš powershell ã®2çš®é¡ãããŸããã sh ãå«ãä»ã®ã·ã§ã«ãå©çšã§ããããã§ãã
SHELL åœä»€ã¯äœåºŠãæå®ã§ããŸããããããã® SHELL åœä»€ã¯ã以åãã¹ãŠã® SHELL åœä»€ãäžæžããã以éã®åœä»€ã§ïŒæ°ããæå®ããã·ã§ã«ãïŒæå¹ã«ãªããŸãã以äžã¯äŸã§ãã
FROM microsoft/windowsservercore
# ãcmd /S /C echo defaultããšããŠå®è¡
RUN echo default
# ãcmd /S /C powershell -command Write-Host defaultããšããŠå®è¡
RUN powershell -command Write-Host default
# ãpowershell -command Write-Host helloããšããŠå®è¡
SHELL ["powershell", "-command"]
RUN Write-Host hello
# ãcmd /S /C echo helloããšããŠå®è¡
SHELL ["cmd", "/S", "/C"]
RUN echo hello
SHELL åœä»€ã«ãã£ãŠå¹æãããã®ã¯ã Dockerfile ã§ã·ã§ã«åœ¢åŒãšã㊠RUN ã CMD ã ENTRYPOINT ã䜿ãæã§ãã
以äžã®äŸã¯ãWindows äžã§ããèŠãããå
±éãã¿ãŒã³ã§ããã SHELL åœä»€ã䜿ã£ãŠå¹çåã§ããŸãã
RUN powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"
Docker ãåŒã³åºãã³ãã³ãã¯ããã®ããã«ãªããŸãã
cmd /S /C powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"
ããã«ã¯ãå¹ççã§ã¯ãªã2ã€ã®çç±ããããŸãããŸã1ã€ã¯ãäžèŠãª cmd.exe ã³ãã³ãã®ããã»ããµïŒã·ã§ã«ïŒãåŒã³åºãããããã§ãã2ã€ãã¯ãå RUN åœä»€ã¯ã·ã§ã«åœ¢åŒã®ãããã³ãã³ãã®åã«è¿œå ã§ powershell -command ã®å®è¡ãå¿
èŠã«ãªãããã§ãã
ãããå¹ççã«ããã«ã¯ã2ã€ã®ä»çµã¿ã®ã©ã¡ãã1ã€ã䜿ããŸãã1ã€ã¯ã次ã®ããã« RUN åœä»€ã®ã³ãã³ãã JSON 圢åŒã§æžããŸãã
RUN ["powershell", "-command", "Execute-MyCmdlet", "-param1 \"c:\\foo.txt\""]
JSON 圢åŒïŒã§äœ¿ãã³ãã³ãã®æå®ïŒã¯æç¢ºã§ãããäžèŠãª cmd.exe ã䜿ããŸãããããããäºéåŒçšç¬ŠïŒããã«ã¯ã©ãŒã¿ïŒããšã¹ã±ãŒãåŠçãå¿
èŠãšãã£ããåé·ãããããŸãããã1ã€ã®ä»çµã¿ã¯ã SHELL åœä»€ã䜿ã£ãŠã·ã§ã«åœ¢åŒã«ããŸããã escape ããŒãµã»ãã£ã¬ã¯ãã£ãã®æå®ãããã°ã Windows ãŠãŒã¶ã«ãšã£ãŠãããæ®éã®æžåŒã§æžããŸãïŒèš³è
è£è¶³ïŒ Dockerfile ã§ã¯ãããã©ã«ãã®ãšã¹ã±ãŒãæåã¯ã \ ãã§ãããWindows ã®å Žåã \ ãã¯ãã¹ã®æåã§ãããã®ãããæ¬¡ã®äŸã®ããã«ãšã¹ã±ãŒãæåãã`ããªã©ã«å€ãããšãWindows ã®ãã¹ãã·ã§ã«åœ¢åŒã§ãã®ãŸãŸå©çšã§ããããã䟿å©ã§ãïŒã
# escape=`
FROM microsoft/nanoserver
SHELL ["powershell","-command"]
RUN New-Item -ItemType Directory C:\Example
ADD Execute-MyCmdlet.ps1 c:\example\
RUN c:\example\Execute-MyCmdlet -sample 'hello world'
çµæã¯æ¬¡ã®ããã«ãªããŸãã
PS E:\myproject> docker build -t shell .
Sending build context to Docker daemon 4.096 kB
Step 1/5 : FROM microsoft/nanoserver
---> 22738ff49c6d
Step 2/5 : SHELL powershell -command
---> Running in 6fcdb6855ae2
---> 6331462d4300
Removing intermediate container 6fcdb6855ae2
Step 3/5 : RUN New-Item -ItemType Directory C:\Example
---> Running in d0eef8386e97
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 10/28/2016 11:26 AM Example
---> 3f2fbf1395d9
Removing intermediate container d0eef8386e97
Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\
---> a955b2621c31
Removing intermediate container b825593d39fc
Step 5/5 : RUN c:\example\Execute-MyCmdlet 'hello world'
---> Running in be6d8e63fe75
hello world
---> 8e559e9bf424
Removing intermediate container be6d8e63fe75
Successfully built 8e559e9bf424
PS E:\myproject>
ãŸããã·ã§ã«ã®åäœã倿Žããããã«ã SHELL åœä»€ã䜿ããŸããããšãã°ã Windows äžã§ SHELL cmd /S /C /V:ON|OFF ã䜿ãã°ã
ããã«ãSHELL åœä»€ã«ãã£ãŠãLinux ã§ããã° zsh ã csh ã tcsh ãšãã£ããä»ã®ã·ã§ã«ã«åãæ¿ããããŸãã
Dockerifle ã®äŸÂ¶
Dockerfile ã®äŸã¯ã以äžãã芧ãã ããã
Get started - å§ããŸããã
åè
- Dockerfile reference