Dockerfile

Dockerfileには、ベースイメージの選択、ファイルのコピー、パッケージのインストール、環境変数の設定など、イメージを構築するための命令を順番に記述します。このファイルを使ってdocker image buildコマンドを実行すると、記述された手順に従ってDockerイメージが自動的に作成されます。

Dockerfileの書式

主要命令内容
FROMベースイメージを指定する(必須)
RUNイメージのビルド時にコマンドを実行する
CMDコンテナ起動時に実行されるデフォルトコマンド
ENTRYPOINTコンテナを実行可能ファイルとして実行する
COPYビルドコンテキストからイメージにファイルをコピーする
ADDファイルを追加する(URL取得やtar自動展開が可能)
WORKDIR以降の命令の作業ディレクトリを設定する
ENV環境変数(ビルド時とランタイムで有効)
ARGビルド引数(ビルド時のみ有効)
EXPOSEコンテナがリッスンするポートを明示する
VOLUMEボリュームのマウントポイント
USER以降の命令を実行するユーザーを指定する
LABELメタデータを追加する
HEALTHCHECKコンテナの健全性をチェックする
ONBUILDこのイメージをベースにした別のDockerfileでビルド時に実行される命令
STOPSIGNALコンテナ停止時に送信するシグナル
SHELLRUN、CMD、ENTRYPOINTのシェル形式で使用されるシェルを変更する

FROM
 ベースイメージを指定する

【書式】
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
【例】
FROM ubuntu:22.04
FROM node:18-alpine
FROM python:3.11-slim
FROM scratch              # 空のイメージから開始

RUN
 イメージのビルド時にコマンドを実行する

1.シェル形式【推奨】
【書式】
RUN <command>
【例】
RUN apt-get update
RUN apt-get install -y nginx
RUN npm install

2.exec形式
【書式】
RUN ["executable", "param1", "param2"]
【例】
RUN ["apt-get", "install", "-y", "nginx"]
RUN ["/bin/bash", "-c", "echo hello"]

CMD
 コンテナ起動時に実行されるデフォルトコマンド

1.exec形式【推奨】
【書式】
CMD ["executable", "param1", "param2"]
【例】
CMD ["nginx", "-g", "daemon off;"]
CMD ["python", "app.py"]
CMD ["node", "server.js"]

2.シェル形式
【書式】
CMD command param1 param2
【例】
CMD nginx -g "daemon off;"
CMD python app.py

ENTRYPOINT
 コンテナを実行可能ファイルとして実行する

1.exec形式(推奨)
【書式】
ENTRYPOINT ["executable", "param1", "param2"]
【例】
ENTRYPOINT ["nginx", "-g", "daemon off;"]
ENTRYPOINT ["python", "app.py"]

2.シェル形式
【書式】
ENTRYPOINT command param1 param2

COPY
 ビルドコンテキストからイメージにファイルをコピーする

1.シェル形式【推奨】
【書式】
COPY <src>... <dest>
【例】
COPY app.py /app/
COPY package*.json ./
COPY src/ /app/src/
COPY . /app
【例】複数ファイル
COPY file1.txt file2.txt /app/
【例】パーミッション指定
COPY --chown=user:group files* /app/
【例】マルチステージビルド
COPY --from=builder /app/dist /usr/share/nginx/html

2.exec形式
【書式】
COPY ["<src>",... "<dest>"]

ADD
 ファイルを追加する(URL取得やtar自動展開が可能)

1.シェル形式【推奨】
【書式】
ADD <src>... <dest>
【例】ファイルコピー(COPYと同じ)
ADD app.py /app/
【例】URL取得
ADD https://example.com/file.tar.gz /tmp/
【例】tar自動展開
ADD archive.tar.gz /app/

2.exec形式
【書式】
ADD ["<src>",... "<dest>"]

WORKDIR
 以降の命令の作業ディレクトリを設定する

【書式】
ORKDIR /path/to/directory
【例】
WORKDIR /app
COPY . .
RUN npm install
【例】相対パス(連続使用)
WORKDIR /app
WORKDIR src        # /app/src
WORKDIR scripts    # /app/src/scripts

ENV
 環境変数(ビルド時とランタイムで有効)

【書式】
ENV <key>=<value>
ENV <key1>=<value1> <key2>=<value2>
【例】
ENV NODE_ENV=production
ENV APP_HOME=/app
ENV PORT=3000
ENV PATH="/app/bin:${PATH}"
【例】複数行
ENV NODE_ENV=production \
    APP_HOME=/app \
    PORT=3000

ARG
 ビルド引数(ビルド時のみ有効)

【書式】
ARG <name>[=<default value>]
【例】
ARG VERSION=1.0
ARG BUILD_DATE
ARG NODE_VERSION=18
【例】使用
FROM node:${NODE_VERSION}
RUN echo "Building version ${VERSION}"

EXPOSE
 コンテナがリッスンするポートを明示する

【書式】
EXPOSE <port>
EXPOSE <port>/<protocol>
【例】
EXPOSE 80
EXPOSE 443
EXPOSE 8080/tcp
EXPOSE 53/udp

VOLUME
 ボリュームのマウントポイント

1.exec形式【推奨】
【書式】
VOLUME ["/data"]
【例】
VOLUME ["/var/log", "/var/db"]

2.シェル形式
【書式】
VOLUME /data
【例】
VOLUME /var/log /var/db

USER
 以降の命令を実行するユーザーを指定する

【書式】
USER <user>[:<group>]
USER <UID>[:<GID>]
【例】
USER node
USER 1000
USER app:app
USER 1000:1000
【例】ユーザー作成と使用
RUN useradd -m -u 1000 appuser
USER appuser

LABEL
 メタデータを追加する

【書式】
LABEL <key>=<value>
【例】
LABEL version="1.0"
LABEL maintainer="user@example.com"
LABEL description="My application"
【例】複数行
LABEL version="1.0" \
      maintainer="user@example.com" \
      description="My application"

HEALTHCHECK
 コンテナの健全性をチェックする

【書式】
HEALTHCHECK [OPTIONS] CMD command
【例】
HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost/ || exit 1
HEALTHCHECK --interval=5m --timeout=3s \
  CMD wget --quiet --tries=1 --spider http://localhost:8080/health || exit 1
【例】ヘルスチェック無効化
HEALTHCHECK NONE

ONBUILD
 このイメージをベースにした別のDockerfileでビルド時に実行される命令

【親イメージのDockerfile】
FROM node:18
ONBUILD COPY package*.json ./
ONBUILD RUN npm install

【子イメージのDockerfile】
FROM mybaseimage
# ↑ のタイミングで ONBUILD命令が実行される

STOPSIGNAL
 コンテナ停止時に送信するシグナル

【書式】
STOPSIGNAL signal
【例】
STOPSIGNAL SIGTERM
STOPSIGNAL 15

SHELL
 RUN、CMD、ENTRYPOINTのシェル形式で使用されるシェルを変更する

【書式】
SHELL ["executable", "parameters"]
【例】
SHELL ["/bin/bash", "-c"]
SHELL ["powershell", "-command"]