🐾

【Docker】Dockerfileについて

2022/12/28に公開

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とよく似ているが、コンテナ実行時に必ず実行される
  • CMDdocker container run時の引数で上書きされるが、ENTRYPOINTdocker container run時の引数を引数として実行する
  • CMDENTRYPOINTが両方書いてある場合はCMDの内容をENTRYPOINTのcommandのオプションとして実行する
ENTRYPOINT <command>

EXPOSE

  • コンテナ実行時にリッスンするポートを指定する
  • デフォルトのプロトコルはtcp
EXPOSE <port> [protocol]

USER

  • ユーザーを指定する
USER <user> [:group]

作成時のポイント

ビルドコンテキストを考慮する

  • イメージのビルド時には、Dockerfileと、そのディレクトリ以下にあるファイルを使ってビルドしている
  • .dockerignoreファイルで不要なフォルダやファイルを除外することでビルド時間を短縮できる

コンテナごとに1つのプロセスだけ実行する

  • コンテナの再利用が容易になる

イメージサイズをできるだけ小さくする

  • ディスク容量を圧迫せず、配布も楽にできる
  • ベースイメージは軽量なものを選ぶ(ただし安易にAipineを選ばない)
  • RUNCMDCOPYは実行するごとにイメージのLayerが作られイメージのサイズが大きくなってしまうため、できるだけまとめる(イメージを作る過程では、ビルドし直す際に変更がないレイヤーはキャッシュがきくので、あえてRUNを分けてキャッシュをうまく活用する)
  • ビルドするイメージと実行するイメージを分離することで実行用イメージのサイズを小さくすることができる(マルチステージビルド)

参考記事

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59

Discussion