
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 | コンテナ停止時に送信するシグナル |
| SHELL | RUN、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"]