目录
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
同一个项目可以有多个 Dockerfile,例如 Dockerfile.dev、Dockerfile.prod。注意,-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
四个镜像大小相同,因为它们都只是在 Alpine 上添加了一个小文件。
其他常用写法
# 同时添加两个名称
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。
答案
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](/zh/docker/docker-init/)。
更新于 2026年10月14日