3.1 命令 FROM
さて、ちょっとおさらいね、Dockerfile は Dockerイメージを作成するための命令が含まれてるテキストファイルだよ。Dockerfile の各命令は特定のタスクを実行して、イメージ内に新しいレイヤーを作成するんだ。この講義では、Dockerfile の基本命令、FROM
, RUN
, COPY
, CMD
の詳細について説明するよ。これらは機能的かつ効率的な Docker イメージを作成するうえで絶対重要だからね。
命令 FROM
は新しいイメージを作成するためのベースイメージを指定するよ。これはどんな Dockerfile においても最初の命令で、イメージ作成の開始点を定義するんだ。
構文
FROM <image>[:<tag>] [AS <name>]
ここで:
<image>
: ベースイメージの名前。<tag>
: (オプション) ベースイメージのバージョン。デフォルトはlatest
。AS <name>
: (オプション) このビルドステージの名前を割り当てる(マルチステージビルドで使用)。
例
ベースイメージ Ubuntu
の使用例:
FROM ubuntu:20.04
公式イメージの Node.js
を使用する場合:
FROM node:14
マルチステージビルドを使った最適化 の例:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
この例では、2つのベースイメージが使われてるよ。最初の (node:14) はアプリケーションをビルドするために使われて、2つ目の (nginx:alpine) は静的ファイルを提供する軽量サーバーを作成するために使われてるの。
マルチステージビルドを使用することで、最終的なイメージには最小限のファイルとプログラム (Nginx
とビルドされた静的ファイル) だけが含まれるようになるから、軽量でデプロイも速くなるんだよね。
3.2 RUN 命令
RUN
命令はコンテナ内でコマンドを実行し、イメージに新しいレイヤーを作成する。この命令はパッケージのインストール、環境の設定、およびイメージを準備するために必要な他のコマンドを実行するために使用される。
構文:
RUN <command>
ここで:
<command>
: コンテナ内で実行されるコマンド。
例:
Ubuntu イメージにパッケージをインストール:
RUN apt-get update && apt-get install -y curl git
コードのコンパイル:
RUN gcc -o myapp myapp.c
複数のコマンドをまとめる
image
のサイズを小さくし、ビルドを高速化するために、複数のコマンドを一つの RUN
命令にまとめることが推奨される。
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 命令 COPY
命令 COPY
はビルドコンテキストからコンテナのファイルシステムにファイルやディレクトリをコピーするよ。これで、ソースコードや設定ファイル、その他のリソースをコンテナに持ち込むのが便利ってわけ。
構文:
COPY <src> <dest>
ここで:
-
<src>
: ビルドコンテキスト内のファイルやディレクトリへのパス。 <dest>
: コンテナ内の宛先パス。
例:
現在のディレクトリの全てのコンテンツをコンテナの作業ディレクトリにコピーする:
COPY . /app
個別のファイルをコピーする:
COPY package.json /app/package.json
COPY server.js /app/server.js
.dockerignore
の使用
不要なファイルをコピー処理から除外するためには、.dockerignore
ファイルを使えばいい。これは .gitignore
と同じように動作するよ。
node_modules
dist
*.log
3.4 命令 CMD
CMD
命令は、コンテナを起動するときに実行されるコマンドを指定します。RUN
がビルド段階で実行されるのに対し、CMD
は作成されたイメージからコンテナを起動した際に実行されます。
構文:
CMD ["executable","param1","param2"]
または
CMD command param1 param2
ここで:
- ["executable","param1","param2"]: exec形式で、信号処理の適切さを確保するために推奨されます。
- command param1 param2:
shell
形式で、コマンドをシェルで実行します。
例:
Node.js
アプリケーションの起動:
CMD ["node", "app.js"]
shell
スクリプトの起動:
CMD /usr/bin/myscript.sh
CMD
と ENTRYPOINT
の違い
CMD
はデフォルトコマンドを指定し、コンテナ起動時に上書き可能です。ENTRYPOINT
は常に実行される固定コマンドを指定します。
ENTRYPOINT
使用例:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
この例では ENTRYPOINT
がPythonスクリプトを実行し、CMD
で引数を指定して、コンテナ起動時に変更可能となっています。
主要な命令を含むDockerfileの例
# ベースイメージ Node.js を使用
FROM node:14
# 作業ディレクトリを設定
WORKDIR /app
# package.json と package-lock.json をコピー
COPY package*.json ./
# 依存関係をインストール
RUN npm install
# アプリケーションのソースコードをコピー
COPY . .
# アプリで使用されるポートを指定
EXPOSE 3000
# アプリケーションを起動するコマンドを定義
CMD ["node", "app.js"]
GO TO FULL VERSION