目次
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 | キャッシュを使わず、すべてのステップを再実行します |
--pull | FROM のベースイメージを毎回ダウンロードし直します(セキュリティ更新を取得できます) |
--platform | 対象プラットフォームを指定します。例:linux/amd64、linux/amd64,linux/arm64 |
--progress | 出力形式を指定します。auto(既定)、plain(全出力)、quiet、rawjson があります |
-q, --quiet | ビルドの進行状況を表示せず、イメージ ID だけを出力します |
--secret id=名前,src=ファイル | ビルド時に必要なシークレットを渡します。イメージには残りません |
--check | ビルドせず、Dockerfile の構文だけをチェックします |
--push | ビルド後、Registry に直接プッシュします |
--load | ビルド結果をローカルのイメージ一覧に読み込みます |
--label キー=値 | イメージにラベルを付けます |
--network | RUN コマンドで使うネットワークモードを指定します。例:host、none |
--add-host ホスト:IP | ビルド時にカスタムのホスト名対応を追加します |
--cache-from / --cache-to | 外部キャッシュの取得元と出力先を指定します(CI でよく使います。GitHub Actionsを参照) |
--ssh default | SSH 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 入門、Dockerfile 命令の一覧
- ビルドキャッシュと最適化:キャッシュの仕組み
- マルチステージビルド:
--targetの詳しい使い方 - マルチプラットフォームイメージ:
--platform - よくあるエラーメッセージ:ビルド失敗時のトラブルシューティング
練習問題
練習問題:このページの 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日