はじめに
前回の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についてです。たぶんこれで一旦終わりです。




コメント