Dockerfileは、Dockerイメージを自動的に構築するためのテキストファイルです。Dockerfileに記述された命令は、上から順に実行され、最終的にDockerイメージが作成されます。ここでは、Dockerfileでよく使用される主要な命令について解説します。
FROM
ベースとなるイメージを指定します。Dockerfileの最初の命令でなければなりません。
| |
LABEL
イメージのメタデータを指定します。キーと値のペアで記述し、イメージに関する情報(作成者、バージョン、説明など)を付与できます。
| |
USER
以降の RUN, CMD, ENTRYPOINT 命令が実行されるユーザーを指定します。デフォルトは root です。セキュリティのため、特権を必要としない操作では非rootユーザーを指定することが推奨されます。
| |
WORKDIR
以降の RUN, CMD, ENTRYPOINT, COPY, ADD 命令が実行される作業ディレクトリを指定します。相対パスで指定した場合、前の WORKDIR 命令からの相対パスとなります。
| |
EXPOSE
コンテナがリッスンするポートを指定します。これはドキュメント目的であり、実際にポートを公開するには docker run -p オプションが必要です。
| |
COPY
ホストマシン(Dockerデーモンが動作しているマシン)のファイルやディレクトリを、コンテナイメージ内にコピーします。
| |
ADD
COPY と似ていますが、次の追加機能があります。
ホストのパスがURLの場合、ファイルをダウンロードしてコンテナに配置します。ホストのパスが圧縮ファイル(tar, gzip, bzip2など)の場合、コンテナ内で自動的に展開します。
| |
通常は COPY の方が推奨されます。ADD の追加機能が必要な場合にのみ使用します。
RUN
イメージのビルド時にコンテナ内でコマンドを実行します。これにより、イメージにソフトウェアをインストールしたり、ファイルをセットアップしたりできます。
| |
複数のコマンドを && でつなぎ、1つの RUN 命令にまとめることで、イメージのレイヤー数を減らし、ビルドキャッシュを効率的に利用できます。
CMD
コンテナが起動したときに実行されるデフォルトのコマンドを指定します。Dockerfile内で1つしか指定できません。複数ある場合は最後のものが有効になります。
| |
shell 形式の場合、コマンドは /bin/sh -c で実行されます。
ENTRYPOINT
コンテナが起動したときに実行されるコマンドを指定します。CMD とは異なり、ENTRYPOINT は常に実行され、CMD は ENTRYPOINT の引数として扱われます。
| |
ENTRYPOINT と CMD を組み合わせることで、柔軟なコンテナ起動コマンドを定義できます。
例えば、ENTRYPOINT ["nginx"] と CMD ["-g", "daemon off;"] の場合、コンテナ起動時には nginx -g "daemon off;" が実行されます。docker run コマンドで引数を指定すると、CMD の内容が上書きされます。
参考
- 青山真也, 『Kubernetes完全ガイド 第2版 impress top gearシリーズ』, インプレス (2021)
- Dockerfile reference | Docker Docs