目次

Docker build コマンド入門:主なオプションと使い方

docker build は Dockerfile に従ってイメージをビルドします。Dockerfile の書き方については、Dockerfile 入門 と Dockerfile 命令の一覧を参照してください。このページでは、コマンド自体のオプションをまとめます。

構文

docker build [オプション] ビルドコンテキストのパス

最もよく使う形式は次のとおりです。

docker build -t myapp:1.0 .

-t はイメージに名前を付けます。最後の . はビルドコンテキスト(build context)です。現在のディレクトリにあるファイルがビルド処理に渡され、Dockerfile も既定ではここから読み込まれます。docker build、docker buildx build、docker image build は同じコマンドです。

よく使うオプション

オプション説明
-t, --tag 名前:tagイメージ名を指定します。複数の -t を使って、複数の名前を付けられます
-f, --file パスDockerfile を指定します(既定ではビルドコンテキスト内の Dockerfile)
--build-arg 名前=値Dockerfile の ARG に値を渡します
--target ステージ名マルチステージビルドで、指定したステージまでをビルドします
--no-cacheキャッシュを使わず、すべてのステップを再実行します
--pullFROM のベースイメージを毎回ダウンロードし直します(セキュリティ更新を取得できます)
--platform対象プラットフォームを指定します。例:linux/amd64、linux/amd64,linux/arm64
--progress出力形式を指定します。auto(既定)、plain(全出力)、quiet、rawjson があります
-q, --quietビルドの進行状況を表示せず、イメージ ID だけを出力します
--secret id=名前,src=ファイルビルド時に必要なシークレットを渡します。イメージには残りません
--checkビルドせず、Dockerfile の構文だけをチェックします
--pushビルド後、Registry に直接プッシュします
--loadビルド結果をローカルのイメージ一覧に読み込みます
--label キー=値イメージにラベルを付けます
--networkRUN コマンドで使うネットワークモードを指定します。例:host、none
--add-host ホスト:IPビルド時にカスタムのホスト名対応を追加します
--cache-from / --cache-to外部キャッシュの取得元と出力先を指定します(CI でよく使います。GitHub Actionsを参照)
--ssh defaultSSH agent をビルドで使えるようにします(例:プライベートリポジトリを git clone する場合)
-o, --output別の場所に出力します。例:type=local,dest=out を指定すると、成果物をディレクトリに出力します

すべてのオプションは docker build --help で確認できます。

サンプルプロジェクト

以下の例では、次のマルチステージ Dockerfile を使います。

FROM alpine:3.23 AS base
ARG GREETING=hello
RUN echo "$GREETING from build" > /greeting.txt

FROM base AS test
RUN cat /greeting.txt && echo "tests passed"

FROM base
CMD ["cat", "/greeting.txt"]

また、Dockerfile.dev もあります。内容は FROM alpine:3.23 と CMD ["echo", "dev image"] だけです。

-t:ビルドして名前を付ける

$ docker build -t greet .

[+] Building 0.6s (6/6) FINISHED                                                                                                       docker:default
 => [internal] load build definition from Dockerfile                                                                                             0.0s
 => => transferring dockerfile: 235B                                                                                                             0.0s
 => [internal] load metadata for docker.io/library/alpine:3.23                                                                                   0.1s
 => [internal] load .dockerignore                                                                                                                0.0s
 => => transferring context: 2B                                                                                                                  0.0s
 => CACHED [base 1/2] FROM docker.io/library/alpine:3.23@sha256:85fe1e81d6758c208f3e1eed4338a1997e19d4be002d4dd32d3100c9a8c010a0                 0.0s
 => => resolve docker.io/library/alpine:3.23@sha256:85fe1e81d6758c208f3e1eed4338a1997e19d4be002d4dd32d3100c9a8c010a0                             0.0s
 => [base 2/2] RUN echo "hello from build" > /greeting.txt                                                                                       0.3s
 => exporting to image                                                                                                                           0.1s
 => => exporting layers                                                                                                                          0.0s
 => => exporting manifest sha256:0d0e8696cb61970ffeebe21706f795d44bb7fdb22662a328bd83a22c9cb91d60                                                0.0s
 => => exporting config sha256:04f0467aef1baf360852e9f8633e676c7cbbcbe454d0827bbdd474dcda4a7d1f                                                  0.0s
 => => exporting attestation manifest sha256:186d1197793b26cefb32e3555067d8caaa7d626310efb2c1eeb6c42bfefb01a1                                    0.0s
 => => exporting manifest list sha256:2632bf33adbcb3cffc3697245d5e0ad0d239b58b46413d39f87e29cbbebfb3ef                                           0.0s
 => => naming to docker.io/library/greet:latest                                                                                                  0.0s
 => => unpacking to docker.io/library/greet:latest                                                                                               0.0s

$ docker run --rm greet
hello from build

[base 2/2] は base ステージの 2 番目のステップを表します。test ステージはビルドされていません。--target を指定しない場合、最後のステージと、そのステージが依存するステージだけがビルドされます。

--build-arg:ビルド引数を渡す

$ docker build -q --build-arg GREETING=hi -t greet:hi .
sha256:c6f108c2247535f2ee548ef5868bdf83911f06e7ecfeab0fb58eb47b19c79154

$ docker run --rm greet:hi
hi from build

GREETING の既定値は hello です。--build-arg GREETING=hi で上書きすると、ビルド後のファイルの内容は hi from build になります。ARG はビルド中だけ使えます。パスワードの受け渡しには使わないでください(理由はセキュリティのベストプラクティスを参照)。

-f:Dockerfile を指定する

$ docker build -q -f Dockerfile.dev -t greet:dev .
sha256:59849c87b388414a149e72c98ff88d30d9b575f5240625c0b8f58332ce5103fb

$ docker run --rm greet:dev
dev image

1 つのプロジェクトに、Dockerfile.dev や Dockerfile.prod など複数の Dockerfile を置けます。-f で読み込む Dockerfile を指定しても、ビルドコンテキストは最後の . のままです。

--target と --progress plain:テストステージだけをビルドして全出力を表示する

$ docker build --target test --progress plain --no-cache . 2>&1 | grep -E "^#[0-9]+ [0-9.]+ |DONE|ERROR" | grep -v DONE
#6 0.210 hello from build
#6 0.210 tests passed
  • --target test は test ステージまでをビルドします。CI でテストを実行するときによく使います。
  • --progress plain を指定すると、RUN コマンドの出力全体(hello from build、tests passed)が表示されます。既定の出力モードでは、ステップが成功すると出力が折りたたまれます。
  • --no-cache を指定すると、キャッシュを使わず RUN を確実に再実行できます。
  • ここでは grep を使って RUN の出力行だけを残しています。#6 0.210 は、6 番目のステップで開始から 0.210 秒経過したことを表します。

結果

$ docker build -q --target base -t greet:base .
sha256:b92f520e3598da9bcb7ceb2cf82977090316062325363faae1d65c3630423b8e

$ docker images greet
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
greet:base     b92f520e3598       12.9MB         3.85MB        
greet:dev      59849c87b388       12.9MB         3.85MB        
greet:hi       c6f108c22475       12.9MB         3.85MB        
greet:latest   2632bf33adbc       12.9MB         3.85MB

4 つのイメージのサイズが同じなのは、どれも Alpine に小さなファイルを 1 つ追加しただけだからです。

その他のよく使う書き方

# 同時に 2 つの名前を付ける
docker build -t myapp:1.2.0 -t myapp:latest .

# ビルドコンテキストはサブディレクトリ、Dockerfile は別の場所
docker build -f docker/Dockerfile.prod -t myapp ./src

# ベースイメージを再ダウンロードし、キャッシュを使わずにビルドする(完全に再ビルド)
docker build --pull --no-cache -t myapp .

# amd64 サーバー向けにビルドする(Apple Silicon Mac 上で実行)
docker build --platform linux/amd64 -t myapp .

# ビルド時にシークレットを使う
docker build --secret id=npm_token,env=NPM_TOKEN -t myapp .

関連する章

練習問題

練習問題:このページの Dockerfile を使い、GREETING を hey にしたイメージをビルドして、greet:hey と greet:latest の 2 つの名前を付けてください。

解答
docker build --build-arg GREETING=hey -t greet:hey -t greet:latest .
docker run --rm greet:latest

出力は hey from build です。

よくある質問

docker build の最後にあるドット(.)は何を意味しますか?

これは**ビルドコンテキスト(build context)**のパスで、. は現在のディレクトリを表します。Docker はこのディレクトリの内容(.dockerignore に記載されたファイルを除く)をビルド処理に渡します。Dockerfile の COPY でコピーできるのは、この中にあるファイルだけです。

docker build と docker buildx build の違いは何ですか?

Docker 23 以降、docker build は docker buildx build のエイリアスです。両者はまったく同じで、--help の Aliases にも記載されています。

ビルド中に RUN コマンドの出力が見えない場合はどうすればよいですか?

--progress plain を追加すると、各ステップの出力全体が表示されます。--no-cache と併用すると、強制的に再実行して問題を確認できます。

実際にビルドせず、Dockerfile だけをチェックするにはどうすればよいですか?

docker build --check . を使うと、構文を確認して警告を表示します。例は [docker init](/ja/docker/docker-init/) を参照してください。

更新日 2026年10月14日