Dockerfileの基本命令とベストプラクティス

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 は常に実行され、CMDENTRYPOINT の引数として扱われます。

ENTRYPOINT ["実行可能ファイル", "引数1"] # exec形式 (推奨)
# 例: ENTRYPOINT ["/usr/sbin/nginx"]

ENTRYPOINT command param1 param2 # shell形式
# 例: ENTRYPOINT nginx -g "daemon off;"

ENTRYPOINTCMD を組み合わせることで、柔軟なコンテナ起動コマンドを定義できます。 例えば、ENTRYPOINT ["nginx"]CMD ["-g", "daemon off;"] の場合、コンテナ起動時には nginx -g "daemon off;" が実行されます。docker run コマンドで引数を指定すると、CMD の内容が上書きされます。

参考