docker build コマンド

Dockerfileからイメージをビルドします。

概要

docker buildコマンドは、DockerfileとコンテキストからDockerイメージをビルドします。コンテキストとは、指定されたPATHまたはURLにある一連のファイルのことです。ビルドプロセスはコンテキスト内のどのファイルも参照できます。Dockerfileには、Dockerが新しいイメージを作成するために使用する命令が含まれています。

オプション

-t, --tag

ビルドしたイメージに名前を付け、オプションでタグを「name:tag」形式で指定します。

$ docker build -t myapp:1.0 .
[+] Building 10.5s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                       0.1s
 => => transferring dockerfile: 215B                                       0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/node:14                 1.2s
 => [1/5] FROM docker.io/library/node:14@sha256:fcb6...                    0.0s
 => [internal] load build context                                          0.0s
 => => transferring context: 32B                                           0.0s
 => CACHED [2/5] WORKDIR /app                                              0.0s
 => [3/5] COPY package*.json ./                                            0.1s
 => [4/5] RUN npm install                                                  8.5s
 => [5/5] COPY . .                                                         0.1s
 => exporting to image                                                     0.5s
 => => exporting layers                                                    0.4s
 => => writing image sha256:a72d...                                        0.0s
 => => naming to docker.io/library/myapp:1.0                               0.0s

-f, --file

Dockerfileの名前を指定します(デフォルトは「PATH/Dockerfile」)。

$ docker build -f Dockerfile.prod -t myapp:prod .
[+] Building 12.3s (10/10) FINISHED
 => [internal] load build definition from Dockerfile.prod                  0.1s
 => => transferring dockerfile: 256B                                       0.0s
...

--no-cache

イメージのビルド時にキャッシュを使用しません。

$ docker build --no-cache -t myapp .
[+] Building 25.7s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                       0.1s
...

--pull

常に新しいバージョンのイメージを取得しようとします。

$ docker build --pull -t myapp .
[+] Building 15.2s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                       0.1s
 => [internal] load .dockerignore                                          0.0s
 => [internal] load metadata for docker.io/library/node:14                 1.5s
 => [1/5] FROM docker.io/library/node:14@sha256:fcb6... DONE              10.2s
...

--build-arg

DockerfileのARG命令で定義されたビルド時変数を設定します。

$ docker build --build-arg NODE_ENV=production -t myapp .
[+] Building 11.8s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                       0.1s
...

--target

マルチステージビルドを使用する場合に、ビルドするターゲットビルドステージを設定します。

$ docker build --target development -t myapp:dev .
[+] Building 8.3s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                       0.1s
 => [internal] load .dockerignore                                          0.0s
 => [internal] load metadata for docker.io/library/node:14                 1.2s
 => [1/5] FROM docker.io/library/node:14@sha256:fcb6...                    0.0s
 => [2/5] WORKDIR /app                                                     0.1s
 => [3/5] COPY package*.json ./                                            0.1s
 => [4/5] RUN npm install                                                  6.5s
 => exporting to image                                                     0.3s
...

使用例

タグ付きでイメージをビルドする

$ docker build -t myapp:latest .
[+] Building 15.2s (10/10) FINISHED
...

複数のタグでビルドする

$ docker build -t myapp:latest -t myapp:1.0 -t registry.example.com/myapp:1.0 .
[+] Building 14.7s (10/10) FINISHED
...
=> => naming to docker.io/library/myapp:latest                             0.0s
=> => naming to docker.io/library/myapp:1.0                                0.0s
=> => naming to registry.example.com/myapp:1.0                             0.0s

特定のDockerfileとコンテキストからビルドする

$ docker build -f ./docker/Dockerfile.prod -t myapp:prod ./app
[+] Building 18.3s (10/10) FINISHED
...

ビルド引数を使用してビルドする

$ docker build --build-arg VERSION=1.0.0 --build-arg ENV=staging -t myapp:staging .
[+] Building 16.5s (10/10) FINISHED
...

ヒント

.dockerignoreファイルを使用する

.dockerignoreファイルを作成して、ビルドコンテキストからファイルやディレクトリを除外しましょう。これにより、不要なファイルがDockerデーモンに送信されるのを防ぎ、ビルド時間とサイズを削減できます。

ビルドキャッシュを活用する

Dockerは中間レイヤーをキャッシュします。キャッシュの使用を最大化するためにDockerfileの命令を順序付けしましょう - 頻繁に変更される命令(ソースコードのコピーなど)は、あまり変更されない命令(依存関係のインストールなど)の後に配置します。

マルチステージビルド

マルチステージビルドを使用して、より小さな本番イメージを作成しましょう。最初のステージにはビルドツールと依存関係を含め、最終ステージにはアプリケーションの実行に必要なものだけを含めることができます。

FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm ci && npm run build

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html

レイヤー数を最小限に抑える

関連するコマンドを&&を使用して単一のRUN命令にまとめることで、イメージのレイヤー数を減らしましょう。

よくある質問

Q1. docker builddocker image buildの違いは何ですか?

A. 同じコマンドです。docker image buildはより明示的な形式ですが、docker buildの方がより一般的に使用されています。

Q2. リモートのGitリポジトリからイメージをビルドするにはどうすればよいですか?

A. GitのURLを使ってdocker buildを使用します:docker build https://github.com/username/repo.git#branch:folder

Q3. Dockerイメージのサイズを減らすにはどうすればよいですか?

A. マルチステージビルドの使用、より小さなベースイメージ(Alpineなど)の使用、パッケージをインストールしたのと同じレイヤーでクリーンアップする、.dockerignoreを使用して不要なファイルを除外するなどの方法があります。

Q4. マルチステージDockerfileで特定のステージをビルドするにはどうすればよいですか?

A. --targetフラグを使用します:docker build --target stage-name -t myimage .

Q5. x86マシン上でARMイメージをビルドできますか?

A. はい、--platformフラグを使用します:docker build --platform linux/arm64 -t myimage .(Docker BuildKitが必要です)

参考資料

https://docs.docker.com/engine/reference/commandline/build/

改訂履歴