Dockerfileは、Dockerイメージを自動的に構築するためのテキストファイルです。Dockerfileに記述された命令は、上から順に実行され、最終的にDockerイメージが作成されます。ここでは、Dockerfileでよく使用される主要な命令について解説します。
FROM
ベースとなるイメージを指定します。Dockerfileの最初の命令でなければなりません。
FROM <イメージ名>[:<タグ>]
# 例: FROM ubuntu:22.04
# 例: FROM python:3.9-slim-buster
LABEL
イメージのメタデータを指定します。キーと値のペアで記述し、イメージに関する情報(作成者、バージョン、説明など)を付与できます。
LABEL <キー>="<値>" [<キー>="<値>" ...]
# 例: LABEL maintainer="Your Name <your.email@example.com>"
# 例: LABEL version="1.0" description="My custom web app image"
USER
以降の RUN
, CMD
, ENTRYPOINT
命令が実行されるユーザーを指定します。デフォルトは root
です。セキュリティのため、特権を必要としない操作では非rootユーザーを指定することが推奨されます。
USER <ユーザー名>[:<グループ名>]
# 例: USER appuser
WORKDIR
以降の RUN
, CMD
, ENTRYPOINT
, COPY
, ADD
命令が実行される作業ディレクトリを指定します。相対パスで指定した場合、前の WORKDIR
命令からの相対パスとなります。
WORKDIR /path/to/workdir
# 例: WORKDIR /app
EXPOSE
コンテナがリッスンするポートを指定します。これはドキュメント目的であり、実際にポートを公開するには docker run -p
オプションが必要です。
EXPOSE <ポート番号> [<ポート番号>/<プロトコル> ...]
# 例: EXPOSE 80
# 例: EXPOSE 8080/tcp 8080/udp
COPY
ホストマシン(Dockerデーモンが動作しているマシン)のファイルやディレクトリを、コンテナイメージ内にコピーします。
COPY <ホストのパス> <コンテナのパス>
# 例: COPY ./app /app
# 例: COPY requirements.txt /tmp/
ADD
COPY
と似ていますが、次の追加機能があります。
ホストのパス
がURLの場合、ファイルをダウンロードしてコンテナに配置します。ホストのパス
が圧縮ファイル(tar, gzip, bzip2など)の場合、コンテナ内で自動的に展開します。
ADD <ホストのパスまたはURL> <コンテナのパス>
# 例: ADD https://example.com/app.tar.gz /app/
通常は COPY
の方が推奨されます。ADD
の追加機能が必要な場合にのみ使用します。
RUN
イメージのビルド時にコンテナ内でコマンドを実行します。これにより、イメージにソフトウェアをインストールしたり、ファイルをセットアップしたりできます。
RUN <コマンド>
# 例: RUN apt-get update && apt-get install -y nginx
# 例: RUN pip install -r requirements.txt
複数のコマンドを &&
でつなぎ、1つの RUN
命令にまとめることで、イメージのレイヤー数を減らし、ビルドキャッシュを効率的に利用できます。
CMD
コンテナが起動したときに実行されるデフォルトのコマンドを指定します。Dockerfile内で1つしか指定できません。複数ある場合は最後のものが有効になります。
CMD ["実行可能ファイル", "引数1", "引数2"] # exec形式 (推奨)
# 例: CMD ["nginx", "-g", "daemon off;"]
# 例: CMD ["python", "app.py"]
CMD command param1 param2 # shell形式
# 例: CMD python app.py
shell
形式の場合、コマンドは /bin/sh -c
で実行されます。
ENTRYPOINT
コンテナが起動したときに実行されるコマンドを指定します。CMD
とは異なり、ENTRYPOINT
は常に実行され、CMD
は ENTRYPOINT
の引数として扱われます。
ENTRYPOINT ["実行可能ファイル", "引数1"] # exec形式 (推奨)
# 例: ENTRYPOINT ["/usr/sbin/nginx"]
ENTRYPOINT command param1 param2 # shell形式
# 例: ENTRYPOINT nginx -g "daemon off;"
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