【どこでも同じ環境で開発を】Dockerざっくりまとめ ③Dockerfile

プログラミング
LINEで送る
Pocket

はじめに

前回の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"にはbashlsなどが入り、これは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"のコマンドを実行しますが、ENTRYPOINTrun時に上書きされません。つまり、コンテナはENTRYPOINTで指定したコマンドを毎回実施します。
ENTRYPOINTがある場合は、CMDCMD ["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についてです。たぶんこれで一旦終わりです。

LINEで送る
Pocket

コメント

タイトルとURLをコピーしました