はじめに
前回のDockerコマンドに引き続き、今回はDockerfileについてです。
Dockerfileについての詳細はDockerfileリファレンスを見たほうがいいのですが、今回もざっくりまとめます。
Dockerfileは①の内容にもあったように、Dockerイメージの設計図であり、txtファイルです。docker build [path]
でDockerfileを読み込み、イメージを構築します。
また慣例的にDockerfileの名前はDockerfileと名付けるようです。
記述書式
そのDockerfileの記法として、行頭にinstructionを記載し、その後ろにその内容を書く形になります。instructionは慣例的に大文字で記載することが多いようです。
Dockerfileの一番初めはFROM
のinstructionからはじめます。
FROM ubuntu:latest
行頭の#
はコメント。
FROM ubuntu:latest
# 以下RUN実施
基本的に改行はinstructionが変わることを意味しますが、\
(バックスラッシュ)が行終にあることで行が続くことを意味します。
また、一つのinstructionに対して、基本的には一つの命令しか行えないですが、&&
でつなぐことで複数の命令が可能になります。
RUN apt-get update && apt-get install -y \
sudo \
vim
instruction
instructionの内、使用頻度が高いであろうものを挙げます。
FROM
FROM
のinstructionは、ベースとなるイメージを設定します。Docker Hubにあるイメージを取得できるので、それを使用するのが一般的なようです。
FROM [image][:<tag>]
<tag>
にはバージョンが入ります。<tag>
を指定しなければ、基本的にはlatastが取得されるようです。
RUN
RUN
のinstructionは、イメージにおいてあらゆるコマンドを実行し、その処理結果を確定します。
RUN [command]
CMD
CMD
のinstructionは、コンテナの実行時のデフォルト処理を設定します。基本的にDockerfileの最後に記述し、1つしか記述できません。
CMD ["executable","param1","param2"]
"executable"
にはbash
やls
などが入り、これはdocker run
の際のcommand
で上書きが可能になります(実際にDockerfileは上書きされず、動作が上書きされる)。上書きされないようにするには後述のENTRYPOINT
と併用する必要があります。
COPY
COPY
のinstructionは、[src]
に指定したファイルやディレクトリをコピーして、コンテナ内のパス[dest]
に追加します。
COPY [src] [dest]
[src]
は複数指定が可能。[src]
に指定するファイルやディレクトリは、build context
(Dockerfileを置いているディレクトリ)からの相対パスを指定します。[dest]
はコンテナ内のパスを指定します。ディレクトリが存在しない場合は自動的に生成されます。
ADD
ADD
のinstructionは、COPY
と同じように[src]
に指定したファイルやディレクトリ、リモートファイルURLをコピーして、コンテナ内のパス[dest]
に追加します。
ADD [src] [dest]
COPY
と違う点として、[src]
がtarの圧縮ファイルの場合、[dest]
下に解凍して展開します。なので、COPY
は単純にファイルやディレクトリをコピーする場合に使用し、ADD
はtarの圧縮ファイルをコピーして解凍するときに使うのがわかりやすい使い方のようです。
ENTRYPOINT
ENTRYPOINT
のinstructionは、コンテナを実行モジュールのようにして実行する設定を行います。
ENTRYPOINT ["executable","param1","param2"]
CMD
と同じように、"executable"
のコマンドを実行しますが、ENTRYPOINT
はrun
時に上書きされません。つまり、コンテナはENTRYPOINT
で指定したコマンドを毎回実施します。ENTRYPOINT
がある場合は、CMD
はCMD ["param1","param2"]
の形を取ります(param
に入るのはENTRYPOINT
で指定したコマンドの引数)。run
時に上書きされるのはCMD
の引数部分だけになります。
ENV
CMD
のinstructionは、環境変数[key]
に[value]
という値を設定します。
ENV [key] [value]
ENV [key]=[value]
どちらの記法でも同じ結果になります。
WORKDIR
WORKDIR
のinstructionは、ワークディレクトリを設定します。
WORKDIR [path]
[path]
に相対パスを指定した場合には、直前のWORKDIR
からの相対パスが指定されます。
Dockerfileで作られるレイヤー
Dockerfileを元に作成されるイメージは、Dockerfileのinstructionの数だけレイヤーが作られます。
例えば・・・
FROM ubuntu
RUN apt-get update && apt-get install -y \
sudo \
vim
CMD ["bash"]
の時は3つのレイヤーが作成されますが、
FROM ubuntu
RUN apt-get update
RUN apt-get install -y \
sudo \
vim
CMD ["bash"]
の場合は4つのレイヤーが作成されます。
ですので、最終的には同じinstructionは&&
や\
でまとめた方がレイヤー数を少なくできて、完成したイメージ容量の節約になります。
ただ、色々試しながらDockerfileを作っている段階では分けて複数のレイヤーにした方が、キャッシュを利用できて時間の節約になります。
以上で、Dockerfileについては終わりです。
次回はDocker composeについてです。たぶんこれで一旦終わりです。
コメント