🐾
【Docker】Dockerfileについて
Dockerfileとは
Dockerfileとは、新規にDockerイメージを作成するための手順を記したテキストファイルになります。 一言で説明すると、Dockerイメージの設計図になります。
書式
命令(instructuion) 引数
instructionは、引数と区別するために基本的に大文字で書かれる
主なinstruction
FROM
- ベースとなるイメージを決定する
- Dockerfileは
FROM
から書き始める
FROM <image> [:tag]
RUN
- コンテナビルド時に実行されるコマンド
-
/
で改行、&&
でまとめることができる
RUN <command>
CMD
- コンテナ起動時に実行されるデフォルトのコマンド
- 原則Dockerfileの最後に記述
- コマンドの書き方にはexec形式とshell形式の二種類あるが、基本的にexec形式(例: ["node","index.js"])を使う
CMD <command>
COPY
- ホスト(ローカル)のファイルやディレクトリをイメージにコピーする
-
ADD
も似た機能だが、コピー以外のこともしてややこしいので、基本的にCOPY
を使えば良い
COPY <copy元> <copy先>
ENV
- 環境変数を設定する
ENV <key> = <value>
WORKDIR
- コマンドを実行する作業ディレクトリを指定する
WORKDIR <directoryのpath>
ENTRYPOINT
-
CMD
とよく似ているが、コンテナ実行時に必ず実行される -
CMD
はdocker container run
時の引数で上書きされるが、ENTRYPOINT
はdocker container run
時の引数を引数として実行する -
CMD
とENTRYPOINT
が両方書いてある場合はCMD
の内容をENTRYPOINT
のcommandのオプションとして実行する
ENTRYPOINT <command>
EXPOSE
- コンテナ実行時にリッスンするポートを指定する
- デフォルトのプロトコルはtcp
EXPOSE <port> [protocol]
USER
- ユーザーを指定する
USER <user> [:group]
作成時のポイント
ビルドコンテキストを考慮する
- イメージのビルド時には、
Dockerfile
と、そのディレクトリ以下にあるファイルを使ってビルドしている -
.dockerignore
ファイルで不要なフォルダやファイルを除外することでビルド時間を短縮できる
コンテナごとに1つのプロセスだけ実行する
- コンテナの再利用が容易になる
イメージサイズをできるだけ小さくする
- ディスク容量を圧迫せず、配布も楽にできる
- ベースイメージは軽量なものを選ぶ(ただし安易にAipineを選ばない)
-
RUN
、CMD
、COPY
は実行するごとにイメージのLayerが作られイメージのサイズが大きくなってしまうため、できるだけまとめる(イメージを作る過程では、ビルドし直す際に変更がないレイヤーはキャッシュがきくので、あえてRUN
を分けてキャッシュをうまく活用する) - ビルドするイメージと実行するイメージを分離することで実行用イメージのサイズを小さくすることができる(マルチステージビルド)
参考記事
Discussion