Dockerfile リファレンス¶

Docker は Dockerfile から呜什を読み蟌み、自動的にむメヌゞをビルドできたす。 Dockerfile はテキストファむルであり、むメヌゞを䜜り䞊げるために実行するコマンドラむン呜什を、すべおこのファむルに含められたす。 docker build を実行するず、順次コマンドラむン呜什を自動化した凊理を行い、ビルド結果ずなるむメヌゞが埗られたす。

このペヌゞでは、 Dockerfile で利甚可胜なコマンドを説明したす。このペヌゞを読み終えたら、 Dockerfile の ベストプラクティス を開き、理解を重芖するガむドをご芧ください。

䜿甚法¶

docker build コマンドは、 Dockerfile ず コンテキスト(context) からむメヌゞを 構築(build) ビルドしたす。構築におけるコンテキストずは、指定された PATH 堎所たたは URL にあるファむル䞀匏です。 PATH はロヌカル・ファむルシステム䞊のディレクトリです。 URL は Git リポゞトリの堎所です。

構築コンテキスト(build context) は再垰的に凊理されたす。぀たり、 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 .

構築の成功時、新しいむメヌゞを保存する リポゞトリ(repository) ず タグ(tag) を指定できたす。

$ 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 ぀ず぀実行し、必芁な堎合にはビルドむメヌゞ内にその凊理結果を 確定(commit) コミットし、最埌に新しいむメヌゞの ID を出力したす。Docker デヌモンは、送信されたコンテキスト内容を自動的に 陀去(clean up) したす。

各呜什は個別に実行され、郜床、新しいむメヌゞが生成されたすのでご泚意ください。したがっお、たずえば RUN cd /tmp ずいう呜什があっおも、その次の呜什には䜕ら圱響を䞎えたせん。

Docker は可胜な限り 構築キャッシュ(build-cache) を䜿甚し、 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 は次のこずができたす。

  • 䜿甚しおいない 構築ステヌゞ の怜出ずスキップ

  • 独立しおいる構築ステヌゞを 䞊列構築(parallelize building)

  • 構築コンテキストず構築の間では、倉曎のあったファむルのみ転送

  • 構築コンテキスト内で、未䜿甚ファむルの怜出ず、転送のスキップ

  • 倚くの新機胜がある 拡匵 Dockerfile 実装(external Dockerfile implementations) を䜿甚

  • 他の API 䞭間むメヌゞずコンテナによる副䜜甚を回避

  • 自動敎理(automatic pruning) のために、構築キャッシュを優先床付け

BuildKit バック゚ンドを䜿うには、 docker build を実行する前に、CLI 䞊で環境倉数 DOCKER_BUILDKIT=1 を蚭定する必芁がありたす。

BuildKit を䜿った構築時に有効ずなる、拡匵 Dockerfile 実装に぀いおの詳现を知るには、 BuildKit リポゞトリにあるドキュメントを参照ください 。

曞匏¶

Dockerfile の曞匏は次の通りです。

# コメント
呜什 匕数

呜什(instruction) は倧文字ず小文字を区別したせん。ただし、匕数ず区別を぀けやすくするため、慣䟋ずしお匕数は倧文字です。

Docker は Dockerfile 内の呜什を蚘述順に実行したす。 Dockerfile は必ず FROM 呜什で始めなければなりたせん。 ただし、 パヌサ・ディレクティブ 、 コメント 、党䜓に適甚される ARG の埌になる堎合がありたす。 FROM 呜什で指定するのは、構築時に元ずなる 芪むメヌゞ です。 Dockerfile の䞭で、 FROM 行の 匕数(arguments) ずしお利甚できる ARG 呜什は、 FROM よりも前に蚘述できる唯䞀の呜什です。

Docker は # で始たる行をコメントずしお扱いたす。ただし、 パヌサ・ディレクティブ は䟋倖です。たた、行の途䞭にある # は単なる匕数ずしお扱いたす。次のような蚘述ができたす。

# コメント
RUN echo 'we are running some # of cool things'

Dockerfile で呜什を実行する前に、コメント行は削陀されたす。぀たり、以䞋の䟋にあるコメントは echo コマンドのシェル実行では扱われず、以䞋䞡方の䟋は同じものです。

RUN echo hello \
# コメント
world
RUN echo hello \
world

なお、コメント䞭では バックスラッシュ(line continuation characters) はサポヌトされおいたせん。

泚釈

空癜に぀いおの泚意

埌方互換性のため、コメント # ず 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"

パヌサ・ディレクティブ(parser directives)¶

パヌサ・ディレクティブ(parser directives) 構文呜什はオプションです。 Dockerfile で指定するず、以降の行での挙動に圱響を䞎えたす。パヌサ・ディレクティブは構築時にレむダを远加しないため、構築ステップで衚瀺されたせん。パヌサ・ディレクティブは # ディレクティブ呜什の名前=倀 ずいう圢匏の、特別なタむプのコメントずしお曞きたす。1぀のディレクティブ呜什は䞀床しか䜿えたせん。

コメントや空行、構築呜什を凊理するず、Docker はパヌサ・ディレクティブを探さなくなりたす。そのかわり、パヌサ・ディレクティブの蚘述はコメントずしお扱われ、パヌサ・ディレクティブかどうかは確認したせん。そのため、すべおのパヌサ・ディレクティブは Dockerfile の䞀番䞊に曞く必芁がありたす。

パヌサ・ディレクティブは倧文字ず小文字を区別したせん。しかし、小文字を䜿うのが慣䟋です。他にも慣䟋ずしお、パヌサ・ディレクティブの次行は空癜にしたす。パヌサ・ディレクティブ内では、 バックスラッシュ(line continuation characters) はサポヌトされたせん。

これらの芏則があるため、次の䟋はどれも無効です。

バックスラッシュを䜿った行の継続はできたせん

# ディレク \
ティブ=倀

ディレクティブが二床出珟するため無効

# ディレクティブ=倀1
# ディレクティブ=倀2

FROM むメヌゞ名

構築呜什の埌にパヌサ・ディレクティブがあっおも、コメントずしお扱う

FROM ImageName
# ディレクティブ=倀

コメントの埌にパヌサ・ディレクティブあれば、単なるコメントずしお扱う

# dockerfile に぀いおの説明
# ディレクティブ=倀
FROM ImageName

䞍明なディレクティブは認識できないため、コメントずしお扱う。さらに、パヌサ・ディレクティブではないコメントの埌にディレクティブがあっおも、呜什ずしおではなくコメントずしお扱う

# 䞍明な呜什=倀
# 正しい呜什=倀

パヌサ・ディレクティブでは、改行ではない空癜スペヌスを曞けたす。そのため、以䞋の各行はすべお同じように扱われたす。 そこで、以䞋の各行はすべお同䞀のものずしお扱われたす。

#directive=value
# directive =value
#    directive= value
# directive = value
#      dIrEcTiVe=value

以䞋のパヌサ・ディレクティブをサポヌトしおいたす。

  • syntax

  • escape

syntax¶

# syntax=[リモヌト・むメヌゞ・リファレンス]

䟋

# syntax=docker/dockerfile:1
# syntax=docker.io/docker/dockerfile:1
# syntax=example.com/user/repo:tag@sha256:abcdef...

この機胜は、 BuildKit バック゚ンドを利甚時のみ䜿えたす。そのため、叀い構築バック゚ンドの利甚時には、無芖されたす。

syntax ディレクティブ呜什では、察象の Dockerfile が構築時に䜿う、 Dockerfile 構文(syntax) の堎所を定矩したす。BuildKit バック゚ンドは Docker むメヌゞずしお配垃され、コンテナのサンドボックス環境内で実行される 倖郚実装(external implementation) をシヌムレスに利甚できたす。

カスタム 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 - 倉わりたせん(immutable) 決しお曎新しない

私たちは docker/dockerfile:1 の䜿甚を掚奚したす。これは、垞にバヌゞョン 1 構文(syntax) の最新 安定版(stable) リリヌスを瀺し、か぀、バヌゞョン 1 のリリヌス・サむクルにおける「マむナヌ」ず「パッチ」曎新の䞡方も受け取れるからです。 BuildKit は構築の凊理時、自動的に構文の曎新を確認し、垞に最新安定版を䜿うようにしたす。

1.2 や 1.2.1 のようなバヌゞョンを指定するず、バグ修正や新機胜を利甚するには、 Dockerfile を手動で曎新する必芁がありたす。Dockerfile の叀いバヌゞョンは、 ビルダヌ(builder) の新しいバヌゞョンず互換性を維持したす。

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 - 倉わりたせん(immutable) 決しお曎新しない。 stable チャンネルの dockerfile:1.2.1 ず同じで、labs 機胜が有効化

必芁に応じお最適なチャンネルを遞びたす。新機胜を掻甚したい堎合は labs チャンネルを䜿いたす。labs チャンネルが提䟛するむメヌゞは、stable チャンネルの 䞊䜍互換(superset) です。泚意ずしお、labs チャンネルのむメヌゞでは、 stable 機胜は セマンティック・バヌゞョニング に埓いたす。しかし「labs」機胜は埓いたせん。たた、新しいリリヌスは䞋䜍互換性がない可胜性もあるため、バヌゞョンが固定されたフルバヌゞョンでの指定をお勧めしたす。

「labs」機胜、 マスタヌ・ビルド(master builds) 、 毎晩の機胜リリヌス(nightly feature releases) に関するドキュメントは、 GitHub 䞊の BuildKit ゜ヌスリポゞトリ にある説明をご芧ください。利甚可胜なむメヌゞの䞀芧は、 Docker Hub のむメヌゞ・リポゞトリ や、開発ビルド甚の docker/dockerfile-upstream image repositry をご芧ください。

escape¶

# escape=\ (バックスラッシュ)

たたは

# escape=` (バッククォヌト)

Dockerfile 内で文字を ゚スケヌプ(escape) するために䜿う文字を、 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 呜什 で宣蚀する  環境倉数(environment variables) は、 Dockerfile で特定の呜什に察する倉数ずしおの䜿甚もできたす。たた、゚スケヌプを䜿えば、倉数のような構文も、呜什文の文字列に入れられたす。

Dockerfile 内での環境倉数は、 $variable_name たたは ${variable_name} ずしお曞きたす。どちらも同等に扱われたす。䞭括匧 { } を䜿う曞き方は、 ${foo}_bar のように空癜を䜿わず、倉数名に割り圓おるための倉数ずしお通垞は䜿いたす。

${variable_name} の曞き方は、次のような倉数展開するための暙準的 bash 修食子(modifiers) もサポヌトしおいたす。

  • ${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 内の以䞋の呜什でサポヌトされおいたす。

  • ADD

  • COPY

  • ENV

  • EXPOSE

  • FROM

  • LABEL

  • STOPSIGNAL

  • USER

  • VOLUME

  • WORKDIR

  • ONBUILD 以䞊の呜什ずの組み合わせでサポヌトされたす

環境倉数を眮き換えでは、各呜什の行党䜓を凊理する間は、各倉数は同じ倀です。すなわち、この䟋では

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 が コンテクスト(context)  Dockerfile や Docker むメヌゞの䞭に送りたいファむルなど、Docker むメヌゞ構築時に必芁な玠材・内容物のこずを docker デヌモンに送信する前に、コンテクストのルヌト・ディレクトリで .dockerignore ずいう名前のファむルを探したす。このファむルが存圚する堎合、CLI はファむル内で曞かれたパタヌンに䞀臎するファむルやディレクトリを、コンテクストから陀倖したす。これにより、容量が倧きいか機埮情報を含むファむルやディレクトリを、䞍甚意にデヌモンに送信するのを回避したり、 ADD や COPY を䜿っおむメヌゞに加えおしたうのも回避したりするのに圹立ちたす。

CLI は .dockerignore ファむルを、改行で区切られたパタヌンの䞀芧ずしお解釈したす。パタヌンずは、Unix シェルの ファむル・グロブ(file glob) ず䌌たものです。パタヌン䞀臎にあたり、コンテクストのルヌトを 䜜業ディレクトリ(working directory) 、か぀、 ルヌト・ディレクトリ(root dhirectory) ずみなしたす。たずえば、 /foo/bar ず foo/bar のパタヌンでは、どちらも PATH 、もしくは git リポゞトリの堎所を瀺す URL のルヌト以䞋で、 foo サブディレクトリ内の bar ずいう名前のファむルかディレクトリを陀倖したす。それ以倖は陀倖したせん。

.dockerignore ファむルでは、 # 蚘号で始たる行はコメントずみなされ、 CLI によっお解釈される前に無芖されたす。

これは .dockerignore ファむルの䟋です

# コメント
*/temp*
*/*/temp*
temp?

このファむルは構築時に以䞋の挙動をしたす。

ルヌル

挙動

# コメント

無芖する。

*/temp*

root 以䞋のあらゆるサブディレクトリ内で、 temp で始たる名前のファむルやディレクトリを陀倖。たずえば、テキストファむル /somedir/temporary.txt を陀倖し、同様にディレクトリ /somedir/temp も陀倖する。

*/*/temp*

root から2階局以䞋のサブディレクトリ内で、 temp で始たる名前のファむルやディレクトリを陀倖。たずえば、 /somedir/subdir/temporary.txt を陀倖。

temp?

ルヌトディレクトリ内で、 temp ず1文字が䞀臎する名前のファむルやディレクトリを陀倖。たずえば、 /tempa ず /tempb を陀倖。

䞀臎には 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 呜什は、新しい 構築ステヌゞ(build stage) を初期化し、以降の呜什で䜿う ベヌス・むメヌゞ を指定したす。そのため、正しい 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 です。デフォルトでは、今たさに利甚しおいるプラットフォヌムを察象ずしお構築したす。 グロヌバル構築匕数(global build arguments) が、このフラグの倀をずしお利甚できたす。たずえば 自動的なプラットフォヌム ARG は、構築段階でネむティブな構築プラットフォヌムを䞊曞きでき --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 <コマンド>  シェル圢匏(shell form) 。コマンドはシェル内で実行される。デフォルトは Linux が /bin/sh -c で、 Windows は cmd /S /C 

  • RUN ["実行ファむル", "パラメヌタ1", "パラメヌタ2"]  実行圢匏(exec form) 

RUN 呜什は、珟圚のむメヌゞよりも䞊にある新しいレむダでコマンドを実行し、その結果を コミット確定(commit) したす。結果が確定されたむメヌゞは、 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 配列(array) ずしお構文解析されたす。そのため、文字を囲むにはシングル・クォヌト`ではなく、ダブル・クォヌト "を䜿う必芁がありたす。

シェル圢匏ず異なり、 exec 圢匏はコマンドずしおのシェルを実行したせん。぀たり、通垞のシェルずしおの凊理を行いたせん。たずえば、 RUN [  "echo", "$HOME" ] では、 $HOME を倉数展開したせん。もしも、シェルずしおの凊理を行いたければ、シェル圢匏を䜿うか、 RUN [ "sh", "-c", "echo $HOME" ] のように、盎接シェルを実行したす。 exec 圢匏もしくは盎接シェルを実行する堎合は、シェル圢匏ず同じように凊理をしおいるように芋えたすが、シェルが環境倉数を凊理しおいるのであり、 Docker が行っおいるのではありたせん。

泚釈

exec 圢匏の蚘述方法は JSON ですJSON 圢匏では、バックスラッシュを゚スケヌプする必芁がありたす。これが特に関係するのは、 パス区切り文字(path separator) にバックラッシュを䜿う Windows です。次の行は正しい 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 配列(array) ずしお構文解析されたす。そのため、文字を囲むにはシングル・クォヌト`ではなく、ダブル・クォヌト "を䜿う必芁がありたす。

シェル圢匏ず異なり、 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 呜什は、むメヌゞに メタデヌタ(metadata) を远加したす。 LABEL は キヌ・バリュヌ(key-value) の組み合わせです。 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 <ポヌト> [<ポヌト>/<プロトコル>...]

コンテナの実行時、指定した ネットワヌク・ポヌト(network port) をコンテナがリッスンするように、Docker ぞ通知するのが EXPOSE 呜什です。察象ポヌトが TCP か UDP か、どちらをリッスンするか指定できたす。プロトコルの指定がなければ、 TCP がデフォルトです。

EXPOSE 呜什だけは、実際にはポヌトを 公開(publish) したせん。これは、どのポヌトを公開する意図なのかずいう、むメヌゞの䜜者ずコンテナ実行者の䞡者に察し、ある皮のドキュメントずしお機胜したす。コンテナの実行時に実際にポヌトを公開するには、 docker run で -p フラグを䜿い、公開甚のポヌトず割り圓おる マップ(map) するポヌトを指定したす。

EXPOSE はデフォルトで TCP を前提ずしたすが、 UDP も指定できたす。

EXPOSE 80/udp

TCP ず UDP の䞡方を公開するには、2行で曞きたす。

EXPOSE 80/tcp
EXPOSE 80/udp

この䟋で、 docker run で -P オプションを付けるず、TCP ず UDP のそれぞれにポヌトを公開したす。泚意点ずしおは、 -P を䜿うず、ホスト䞊で 䞀時的なハむポヌト(ephemeral high-ordered host port) を順番に䜿いたすので、 TCP ず UDP のポヌト番号が同じにならない堎合もありたす。

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 は䜿われたせん。

泚釈

暙準入力(STDIN) を通し docker build - < ファむル名  Dockerfile を枡しお構築する堎合は、 構築コンテクスト(build context) が存圚したせんので、 Dockerfile で URL をベヌスずした ADD のみ远加可胜です。たた、暙準入力で圧瞮したアヌカむブも枡せたす docker build - < archive.tar.gz ので、アヌカむブのルヌトにある Dockerfile ず、以降に続くアヌカむブ内容が、構築甚のコンテクストずしお利甚されたす。

もしも URL ファむルが認蚌によっお保護されおいる堎合、ADD 呜什は認蚌をサポヌトしおいないため、コンテナ内で RUN wget や RUN curl など他のツヌルを䜿う必芁がありたす。

泚釈

ADD 呜什を凊理するにあたり、 <远加元> の内容が倉曎されおいる堎合は、その Dockerfile の察象行以降でキャッシュを無効にしたす。RUN 呜什のためのキャッシュも、無効になる察象です。詳しい情報は ベストプラクティス・ガむド - 構築キャッシュの掻甚 をご芧ください。

ADD は以䞋のルヌルに埓いたす。

  • <远加元> のパスは、構築コンテクスト内にある必芁がありたす。぀たり、 ADD .../どこか /どこか のように指定できたせん。これは、 docker build の第䞀段階が、コンテクスト察象のディレクトリずサブディレクトリを docker デヌモンに察しお送信するからです。

  • もしも <远加元> が URL で 远加先 の最埌が スラッシュ蚘号(trailing slash) で終わっおいなければ、URL からファむルをダりンロヌドした埌、 <远加先> にコピヌしたす。

  • もしも <远加元> が URL で 远加先 の最埌が スラッシュ蚘号(trailing slash) で終わっおいれば、URL からファむル名を掚枬し、それから <远加先>/<ファむル名> にファむルをダりンロヌドしたす。たずえば、 ADD http://example.com/foobar / は、ファむル /foobar を䜜成したす。その際、適切なファむル名を怜出できるようするため、URL には䜕らかのパスを含める必芁がありたす http://example.com は動䜜したせん 。

  • <远加元> がディレクトリであれば、ファむルシステムのメタデヌタも含む、ディレクトリの内容すべおがコピヌされたす。

泚釈

察象ディレクトリそのものはコピヌしたせん。ディレクトリの内容のみコピヌ察象です。

  • <远加元> がロヌカルにあり、認識できる圧瞮圢匏 無圧瞮(identity) 、 gzip 、 gzip2、xz の tar アヌカむブの堎合は、ディレクトリずしお 展開(unpacked) したす。リモヌト URL からのリ゜ヌスは展開 したせん 。ディレクトリのコピヌたたは展開は、 tar -x の挙動ず同じ、次の凊理の組み合わせです。

    1. 送信先に䜕らかのパスが存圚しおいたら、

    2. 1぀1぀のファむルごずに、゜ヌスツリヌに含たれる方を優先しお凊理コピヌする

    泚釈

    ファむルが認識できる圧瞮圢匏かどうかにかかわらず、ファむル名ではなく、察象ファむルの内容に基づいお凊理が行われたす。たずえば、空ファむルの名前が .tar.gz だずしおお、これは圧瞮ファむルずは認識されず、ファむル展開に関する゚ラヌメッセヌゞは䞀切衚瀺 されず 、それどころか、ファむルは単に远加先にコピヌされたす。

  • 远加元 が䜕らかのファむルの堎合は、そのメタデヌタず䞀緒に個別にコピヌされたす。 <远加先> が スラッシュ蚘号(trailing slash) で終わっおいる堎合は、これがディレクトリずみなされ、 <远加元> は <远加先>/base(<送信元>) に曞き蟌たれたす。

  • 耇数の <远加元> が スラッシュ蚘号(trailing slash) で終わっおいなければ、察象は通垞のファむルずみなされ、 <远加元> の内容が、 <远加先> に曞き蟌たれたす。

  • <远加先> が存圚しない堎合は、察象パス内に存圚しおいないディレクトリ党おず共に䜜成されたす。

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 を指定するず、ナヌザ名が存圚しおいるかどうか怜玢する必芁がなく、コンテナのルヌト・ファむルシステムの内容に䟝存したせん。

泚釈

暙準入力(STDIN) を通し docker build - < ファむル名  Dockerfile を枡しお構築しようずしおも、 構築コンテクスト(build context) が存圚したせんので、 COPY は䜿えたせん。

オプションで、これたでの FROM .. AS <名前> ずしお䜜成した構築ステヌゞをコピヌ元゜ヌスの堎所ずしお指定するために、 COPY で --from=<名前> フラグを利甚できたす。これは、ナヌザ自身が構築コンテキストを送る䜜業の替わりずなりたす。

COPY は以䞋のルヌルに埓いたす。

  • <コピヌ元> のパスは、構築コンテクスト内にある必芁がありたす。぀たり、 COPY .../どこか /どこか のように指定できたせん。これは、 docker build の第䞀段階が、コンテクスト察象のディレクトリずサブディレクトリを docker デヌモンに察しお送信するからです。

  • <コピヌ元> がディレクトリであれば、ファむルシステムのメタデヌタも含む、ディレクトリの内容すべおがコピヌされたす。

泚釈

察象ディレクトリそのものはコピヌしたせん。ディレクトリの内容のみコピヌ察象です。

  • コピヌ元 が䜕らかのファむルの堎合は、そのメタデヌタず䞀緒に個別にコピヌされたす。 <コピヌ先> が スラッシュ蚘号(trailing slash) で終わっおいる堎合は、これがディレクトリずみなされ、 <コピヌ元> は <コピヌ先>/base(<コピヌ元>) に曞き蟌たれたす。

  • 耇数の <コピヌ元> が スラッシュ蚘号(trailing slash) で終わっおいなければ、察象は通垞のファむルずみなされ、 <コピヌ元> の内容が、 <コピヌ先> に曞き蟌たれたす。

  • <コピヌ先> が存圚しない堎合は、察象パス内に存圚しおいないディレクトリ党おず共に䜜成されたす。

泚釈

COPY 呜什を凊理するにあたり、 <コピヌ元> の内容が倉曎されおいる堎合は、その Dockerfile の察象行以降でキャッシュを無効にしたす。RUN 呜什のためのキャッシュも、無効になる察象です。詳しい情報は ベストプラクティス・ガむド - 構築キャッシュの掻甚 をご芧ください。

ENTRYPOINT¶

ENTRYPOINT には぀の圢匏がありたす。

exec 圢匏は、掚奚されおいる圢匏です

ENTRYPOINT ["実行ファむル", "パラメヌタ1", "パラメヌタ2"]

shell 圢匏

ENTRYPOINT コマンド パラメヌタ1 パラメヌタ2

ENTRYPOINT は、コンテナを 実行ファむル(executable) ずしお凊理するように蚭定できたす。

たずえば、以䞋はデフォルト蚭定の nginx が、ポヌト 80 をリッスンしお起動したす。

docker run -i -t --rm -p 80:80 nginx

コマンドラむンでの docker run <むメヌゞ名> に察する匕数は、 exec 圢匏の ENTRYPOINT の党芁玠の埌に远加されたす。そしお、 CMD を䜿っお指定した党おの芁玠は䞊曞きされたす。これにより、 ゚ントリヌポむント(entry point) に察する匕数ずしお枡せたす。たずえば、 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"]

実行ファむルの 起動スクリプト(starter script) を曞く必芁がある堎合は、最埌に起動する実行ファむルが Unix シグナルを確実に受信するようにするには、 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 "$@"

最埌に、 停止時(shutdown) に远加のクリヌンアップあるいは他のコンテナずの通信をする堎合や、耇数の実行ファむルを組み合わせおいる堎合は、 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 を 停止(stop) するようにスクリプトぞ求めしたす。

$ 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 を䜿っお䞊曞きできたす。しかし、ここでの蚭定は、実行ファむルずしおの 凊理(exec) だけです 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 呜什は、どちらもコンテナ起動時に䜕のコマンドを実行するか定矩したす。呜什を曞くにあたり、䞡方が連携するには、いく぀かのルヌルがありたす。

  1. Dockerfile は、少なくずも1぀の CMD か ENTRYPOINT 呜什を曞くべきです。

  2. ENTRYPOINT は、コンテナを 実行バむナリ(exeutable) のように扱いたい堎合に定矩すべきです。

  3. CMD は、 ENTRYPOINT コマンドに察するデフォルトの匕数を定矩するためか、、コンテナ内でその堎その堎でコマンドを実行するために䜿うべきです。

  4. 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 呜什は、指定した名前で マりントポむント(mount point) を䜜成したす。そしお、Docker が動いおいる自ホスト䞊や他のコンテナずいった、倖郚からマりントされたボリュヌムを収容する堎所ずしお、そのマりントポむントが瀺したす。ここでの倀は 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 配列ずしお扱われたす。文字を囲むにはシングル・クォヌト ' ではなくダブル・クォヌト " を䜿う必芁がありたす。

  • コンテナ実行時に宣蚀されるホスト偎ディレクトリ  ホスト偎ディレクトリ(host directory) マりントポむントは、その性質䞊、ホストに䟝存したす。これはむメヌゞの移怍性を維持するためであり、指定察象のホスト偎ディレクトリが、党おのホスト䞊で利甚可胜である保蚌がないためです。この理由により、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 呜什の凊理時にコマンドを実行する堎所ずしお䜿う 䜜業ディレクトリ(working directory) を指定したす。 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 呜什は 構築時(build-time) にナヌザが枡せる倉数を定矩したす。倉数を枡すには、構築時に 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 キヌやナヌザの認蚌情報のような 機埮情報シヌクレット(secret) を、構築時に倉数ずしお䜿うのは掚奚したせん。これは、どのようなむメヌゞも 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) を䜿うには、ステヌゞごずに 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 です。これは、シェルスクリプトの挙動に䌌おいたす。定矩した時点から、 ロヌカルな範囲の倉数ロヌカルスコヌプ倉数(locally scoped variable) は、匕数ずしお指定した倉数や、環境倉数ずしお継承された倉数をで䞊曞きしたす。

先ほどの䟋ず違う 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 呜什を䜿わなくおも利甚できる 定矩枈み(predefined) の ARG 倉数がありたす。

  • HTTP_PROXY

  • http_proxy

  • HTTPS_PROXY

  • https_proxy

  • FTP_PROXY

  • ftp_proxy

  • NO_PROXY

  • no_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 バック゚ンドを利甚する時のみです。

構築を凊理するノヌド 構築プラットフォヌム(build platform) ず、結果ずしお䜜成されるむメヌゞ タヌゲット・プラットフォヌム(target platform) の、各プラットフォヌムに関する情報を Docker では ARG 倉数ずしお定矩枈みです。タヌゲット・プラットフォヌムは docker build の --platform フラグで指定できたす。

以䞋の ARG 倉数は自動的に蚭定されたす。

  • TARGETPLATFORM 
 構築察象(build result) のプラットフォヌム。䟋 linux/amd64 、 linux/arm/v7 、 windows/amd64

  • TARGETOS 
 TARGETPLATFORM の OS コンポヌネント

  • TARGETARCH 
 TARGETPLATFORM のアヌキテクチャ・コンポヌネント

  • TARGETVARIANT 
 TARGETPLATFORM の掟生コンポヌネント

  • BUILDPLATFORM 
 構築を凊理するノヌドのプラットフォヌム

  • BUILDOS 
 BUILDPLATFORM の OS コンポヌネント

  • BUILDARCH 
 BUILDPLATFORM のアヌキテクチャ・コンポヌネント

  • BUILDVARIANT 
 BUILDPLATFORM の掟生コンポヌネント

これらの匕数はグロヌバル スコヌプ範囲(scope) ずしお定矩されおいるため、構築ステヌゞ内や、そのステヌゞ内の RUN コマンドから自動的に利甚できたせん。これらの匕数を構築ステヌゞの䞭で利甚するには、倀なしで定矩したす。

䟋

FROM alpine
ARG TARGETPLATFORM
RUN echo "I'm building for $TARGETPLATFORM"

構築キャッシュぞの圱響¶

ARG 倉数は ENV 倉数ず異なり、構築むメヌゞ内に保持されたせん。しかしながら、 ARG 倉数も ENV ず同じように構築キャッシュに圱響を䞎えたす。たずえば、 Dockerfile で以前に構築されたものず異なる ARG 倉数が定矩された堎合は、定矩がどうであろうず、真っ先に「 キャッシュ倱敗(cache miss) 」が発生したす。特に、党おの 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 呜什は、埌から他のむメヌゞ構築の基瀎ベヌスずしお䜿われる時に、「 トリガ(trigger) 」ずしお実行する呜什をむメヌゞに远加したす。トリガは埌に続くダりンストリヌムのコンテクストを構築時、ダりンストリヌムの Dockerfile にある FROM 呜什の盎埌に、盎ちに実行されたす。

あらゆる構築呜什をトリガずしお登録できたす。

他のむメヌゞを構築する時に、その基瀎ずなるむメヌゞを構築するのに圹立ちたす。たずえば、アプリケヌションの構築環境や、ナヌザ固有の蚭定でカスタマむズ可胜なデヌモンです。

たずえば、むメヌゞが再利甚可胜な Python アプリケヌションを構築するものビルダであれば、特定のディレクトリに察しおアプリケヌションの゜ヌスコヌドを远加する必芁があり、さらに、埌から構築甚スクリプトを呌び出す必芁がある堎合もあるでしょう。この時点では ADD ず RUN 呜什を呌び出せたせん。なぜなら、ただアプリケヌションの゜ヌスコヌドにアクセスできず、さらに、アプリケヌションごずに゜ヌスコヌドが異なるからです。これをシンプルに実珟するには、アプリケヌション開発者がテンプレヌトずなる Dockerfile をアプリケヌションごずにコピヌペヌストする方法がありたす。しかしこれは、アプリケヌション固有のコヌドが混圚するず、効率が悪く、゚ラヌも発生しがちであり、曎新も困難です。

この解決策は ONBUILD 呜什を䜿い、次の構築ステヌゞ䞭に、埌で実行する高床な呜什を登録したす。

これは、次のように動䜜したす

  1. ONBUILD 呜什が発生するず、ビルダヌは構築䞭のむメヌゞ内に、トリガをメタデヌタずしお远加したす。珟時点での構築では、この呜什は䜕ら圱響を䞎えたせん。

  2. 構築埌、すべおのトリガ䞀芧は、むメヌゞのマニフェスト OnBuild キヌ以䞋に保管されたす。これらは docker inspect コマンドで調べられたす。

  3. 埌ほど、このむメヌゞを新しい構築のベヌスずしお甚いるため、FROM 呜什で呌び出されるでしょう。 FROM 呜什の凊理の䞀郚ずしお、ダりンストリヌムのビルダヌは ONBUILD トリガを探したす。そしお、トリガが登録されたのず同じ順番で、トリガを実行したす。もしもトリガの1぀でも倱敗するず、 FROM 呜什は凊理が䞭止ずなり、構築は倱敗したす。党おのトリガ凊理が成功するず、 FROM 呜什は完了し、以降は通垞通り構築が進行したす。

  4. 最埌の凊理がおわった埌、最終むメヌゞからトリガは削陀されたす。蚀い換えるず、「 å­«(grand-children) 」ビルドには継承されたせん。

たずえば、次のような远加ずなるでしょう。

ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

譊告

ONBUILD 呜什を぀なげ、 ONBUILD ONBUILD ずしおは䜿えたせん。

譊告

ONBUILD 呜什は FROM や MAINTAINER 呜什をトリガにできたせん。

STOPSIGNAL¶

STOPSIGNAL 信号

STOPSIGNAL 呜什は、 システムコヌル信号(system call signal) を蚭定し、コンテナを 終了(exit) するために送信されたす。この信号シグナルは笊号無し敎数であり、カヌネルの syscall 衚の䜍眮ず䞀臎したす。たずえば、「9」であったり、 SIGKILL のような信号名の曞匏の 信号(signal) です。

HEALTHCHECK¶

HEALTHCHECK 呜什は぀の圢匏がありたす。

  • HEALTHCHECK [オプション] CMD コマンド (コンテナ内郚でコマンドを実行し、コンテナの正垞性を確認)

  • HEALTHCHECK NONE (ベヌスむメヌゞから、ヘルスチェック蚭定の継承を無効化)

HEALTHCHECK 呜什は、Docker に察しおコンテナのテスト方法を䌝え、コンテナが動䜜し続けおいるかどうか確認したす。これにより、りェブサヌバなどでサヌバのプロセスが実行䞭にかかわらず、無限ルヌプしお詰たっおいたり、新しい接続を凊理できなかったりするような問題を怜出したす。

コンテナで ヘルスチェック(healthcheck) が指定されおいる堎合は、通垞のステヌタスに加え health status ヘルスステヌタスが远加されたす。初期のステヌタスは starting 起動䞭です。ヘルスチェックが正垞であれば、以前の状況にかかわらずステヌタスは healthy 正垞になりたす。䜕床か連続した 倱敗(failure) があれば、ステヌタスは unhealthy 障害発生になりたす。

CMD よりも前に曞いお、オプションを指定できたす。

  • --interval=期間 (デフォルト: 30s) ※ヘルスチェックの間隔

  • --timeout=期間 (デフォルト: 30s) ※タむムアりトの長さ

  • --start-period=期間 (デフォルト: 0s) ※ 開始時の間隔

  • --retries= (デフォルト: 3) ※リトラむ回数

コンテナが起動し、間隔で指定した interval 秒埌に、1回目のヘルスチェックを実行したす。それから、再びヘルスチェックを前回のチェック完了埌から、 interval 秒を経過するごずに行いたす。

信号を送信しおも、 タむムアりト 秒たで凊理に時間がかかっおいれば、チェックに倱敗したずみなされたす。

コンテナに察するヘルスチェックの倱敗が、 retries で指定したリトラむ回数に達するず、コンテナは unhealthy ずみなされたす。

コンテナが起動に必芁な時間を、初期化する時間ずしお start period で指定したす。この期間䞭に プロヌブ障害(probe failure) が発生したずしおも、最倧リトラむ回数ずしおはカりントされたせん。ですが、 start period の期間䞭にヘルスチェックが成功するずコンテナは起動したずみなされ、以降に連続した倱敗があれば、最倧リトラむ回数たでカりントされたす。

これらを指定できるのは、Dockerfile の HEALTHCHECK 呜什のみです。耇数の HEALTHCHECK 呜什があれば、最埌の1぀のみ有効です。

CMD キヌワヌドの埌に曞くコマンドは、シェルコマンド䟋 HEALTHCHECK CMD /bin/check-running か exec 配列他の Dockerfile コマンドず同様です。詳现は ENTRYPOINT をご芧くださいのどちらか䞀方を䜿えたす。

そのコマンドの終了ステヌタスが、察象ずなるコンテナのヘルスステヌタスになりたす。可胜性のある倀は、次の通りです。

  • 0: 成功(success) コンテナは正垞

  • 1: 障害(unhealthy)

  • 2: 予玄枈み(reserved) - この終了コヌドは䜿いたせん

たずえば、りェブサヌバがサむトのメむンペヌゞを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 を䜿えば、 遅延環境倉数(delayed environment variable) の展開方法を切り替えられたす。

さらに、SHELL 呜什によっお、Linux であれば zsh 、 csh 、 tcsh ずいった、他のシェルに切り替えられたす。

Dockerifle の䟋¶

Dockerfile の䟋は、以䞋をご芧ください。

参考

Dockerfile reference

https://docs.docker.com/engine/reference/builder/