はじめに
この記事では、Dockerfile の各インストラクションについて記載します。
(随時、追記していきます。)
前提
関連する用語を整理します。
インストラクション
Dockerfile に記載する FROM [値]
や RUN [値]
などのことです。
Dockerfile には以下のインストラクションがあります。
Dockerfile
Docker イメージを作成するためのテキストファイル(Docker イメージの設計書)です。
Dcokerfile 内のインストラクション(設定)を読み込む(ビルドする)ことで Docker イメージが作成されます。
イメージ
コンテナを作成するためのテンプレートファイルです。
イメージを実行することで Docker コンテナが作成されます。
イメージは、複数のレイヤ(層)によって構成されています。1つのレイヤにつきOSやミドルウェアが1つインストールされています。
コンテナ
イメージに基づいてアプリケーションを実行する環境・インスタンスです。
主要なインストラクション
関連する用語が整理できたので、各インストラクションの役割について記載していきます。
FROM
新たに作成するイメージのベースとなるイメージを指定します。
FROM
は Dockerfile の先頭に記載します。FROM
でベースイメージを指定した後、アプリケーションのインストールやファイルの追加などの変更を加えていきます。
# FROM [--platform=<platform>] <image> [AS <name>]
# FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
# FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
FROM node:21-alpine3.18
※実用例
RUN
FROM
で記載したベースイメージに対し、実行するコマンドを指定します。
コマンドを実行すると、現在のイメージの上に新しいレイヤが作成されます。作成されたレイヤは、Dockerfile の次のインストラクションで利用されます。
# INSTRUCTION command param1 param2
RUN npm install --production
RUN
及びこの後記載する CMD
、ENTRYPOINT
には以下2つの形式があります。
- 実行形式(exec form):
INSTRUCTION ["executable","param1","param2"]
- シェル形式(shell form):
INSTRUCTION command param1 param2
それぞれ Dockerfile 内の書式を Docker コンテナで実行する際の変換方法が異なります。
シェル形式のほうが一般的に使われているようです。
※実用例
CMD
Docker イメージから Docker コンテナを起動するときに実行するコマンドとオプションを指定します。
そのため、CMD
は Dockerfile のなかで一度しか使えません。
# CMD ["executable","param1","param2"]
CMD ["/usr/local/bin/python3", "-m", "http.server", "8000"]
※実用例
ENV
Dockerfile 内で環境変数を設定します。
イメージビルド時とコンテナ実行時に有効です。
# ENV <key>=<value> ...
ENV MYSQL_DATABASE=sample_app
※実用例
COPY
ホストマシンのファイルやディレクトリをコンテナのレイヤ(イメージ)にコピーします。
<src>
がコピー元、<dest>
がコピー先です。
# COPY [OPTIONS] <src> ... <dest>
# COPY [OPTIONS] ["<src>", ... "<dest>"]
COPY package*.json ./
※実用例
ADD
ホストマシンやインターネットのファイルをコンテナのレイヤ(イメージ)にコピーします。
COPY
よりも多機能です。
# ADD [OPTIONS] <src> ... <dest>
# ADD [OPTIONS] ["<src>", ... "<dest>"]
ADD hom* /mydir/
WORKDIR
RUN
や CMD
、ENTRYPOINT
、COPY
、ADD
といったインストラクションを実行するディレクトリを設定します。
Dockerfile に WORKDIR
が存在しない場合、ルートディレクトリ(/
)に自動で作成されます。
# /path/to/workdir
WORKDIR /app
EXPOSE
コンテナのポートを設定します。
# EXPOSE <port> [<port>/<protocol>...]
EXPOSE 80/udp