4.1 docker buildコマンドの基本
docker buildコマンドは、DockerfileからDockerイメージを作成するための主な方法だよ。Dockerfileの指示を順番に実行して、レイヤーからイメージを構築するんだ。この講義では、docker buildコマンドがどのように動作するのか、どんなパラメータがあるのか、そして実際にどう使うのかを解説していくね。
docker buildコマンドは、Dockerfileといわゆるビルドコンテキストを使ってイメージをビルドするよ。ビルドコンテキストっていうのは、Dockerがイメージ作成に使うファイルたちのことだよ。それは、例えば自分のマシンにあるローカルフォルダだったり、GitHubのリポジトリだったりするんだ。
構文
docker build [OPTIONS] PATH | URL | -
ここで:
-
PATH: Dockerfileとビルドコンテキストを含むディレクトリへのパス。 URL: リモートリポジトリのURLアドレス。-: 標準入力(stdin)からDockerfileを読み込む。
基本的な使い方の例
この例では、Dockerは現在のディレクトリ (.)にあるDockerfileを使って、名前がmyimageでタグがlatestのイメージを作成するよ。
docker build -t myimage:latest .
4.2 buildコマンドのカスタマイズ
docker buildコマンドの主なパラメータ
docker buildコマンドは、多くのオプションをサポートしていて、ビルドプロセスをカスタマイズできるよ。
1. パラメータ -t, --tag
パラメータ-tまたは--tagは、作成するイメージに名前とタグを付けるために使うよ。
docker build -t myimage:latest .
2. パラメータ -f, --file
パラメータ-fまたは--fileは、標準のDockerfileと異なる代替のDockerfileを指定するために使うよ。
docker build -f Dockerfile.dev -t myimage:dev .
3. パラメータ --build-arg
パラメータ--build-argは、Dockerfile内のARG命令で定義されたビルド引数を渡すために使うよ。
docker build --build-arg APP_VERSION=1.0 -t myimage:1.0 .
4. パラメータ --no-cache
パラメータ--no-cacheは、キャッシュを使用せずにビルドを実行するために使うんだ。すべてのコマンドを再実行する必要がある場合に便利だよ。
docker build --no-cache -t myimage:latest .
5. パラメータ --target
パラメータ--targetは、マルチステージビルドで対象のステージを指定するために使うよ。
docker build --target builder -t myimage:builder .
6. パラメータ --rm
パラメータ--rmは、イメージのビルドが成功した後に中間コンテナを削除するようDockerに指示するために使うよ(デフォルトで有効になっている)。
docker build --rm -t myimage:latest .
4.3 docker buildの例
例 1: 基本的なビルド
Node.jsのシンプルなアプリケーションを持っていて、それをデプロイするためのDockerイメージを作成したいとします。
Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
ビルドコマンド:
docker build -t mynodeapp:latest .
この例では、Dockerは現在のディレクトリにあるDockerfileを用いて、mynodeappという名前でタグlatestのイメージを作成します。
例 2: 引数を使用したビルド
ビルド引数を使うと、ビルド時にDockerfileに変数を渡すことができます。
Dockerfile
FROM node:14
ARG APP_VERSION
ENV APP_VERSION=${APP_VERSION}
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
ビルドコマンド:
docker build --build-arg APP_VERSION=1.0 -t mynodeapp:1.0 .
この例では、引数APP_VERSIONがDockerfileに渡され、ビルド中にアプリケーションのバージョンを設定できるようになります。
例 3: マルチステージビルド
マルチステージビルドは、必要なコンポーネントだけを含むイメージを作成するのに使用されます。これにより、最終的なイメージのサイズを小さくできます。
Dockerfile
# ビルドステージ
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
ビルドコマンド:
docker build -t mywebapp:latest .
この例では、最初にbuilderという中間イメージを作成し、その中でアプリケーションをビルドします。ビルド後、アプリケーションはNginxを使用して静的コンテンツを提供する最終イメージに移動されます。
4.4 実践的なアドバイス
1. 命令の順序を最適化
Dockerのキャッシュを効率的に使うには、命令を正しく順序付けることが重要だよ。例えば、package.jsonのようなあまり変更されないファイルを最初にコピーして、依存関係の再構築を最小限に抑えよう。その後、その他のファイルをコピーしてね。
COPY package*.json ./
RUN npm install
COPY . .
2. .dockerignore の使用
.dockerignore ファイルを追加して、ビルドコンテキストから不要なファイルやディレクトリを除外しよう。これによりコンテキストのサイズが小さくなり、イメージのビルドが速くなるよ。
.dockerignore の例:
node_modules
dist
*.log
3. マルチステージビルド
ミニマリスティックで軽量なイメージを作成するためにマルチステージビルドを採用しよう。このアプローチでは、アプリケーションの動作に本当に必要なファイルや依存関係だけを含めることができ、最終的なイメージからは不要なデータ(例えば、一時ファイルやソースコード)を除外できるよ。
GO TO FULL VERSION