docker build -f 是什么
docker build 默认读取构建上下文根目录下的 Dockerfile;多环境场景用 -f 指向子目录或改了名字的 Dockerfile 文件。要注意 -f 的路径以当前工作目录为基准,而 COPY 的源路径始终相对构建上下文,这两个概念不能混为一谈。
基本信息
| 用途 | 指定本次构建使用哪个 Dockerfile |
|---|---|
| 语法 | docker build -f docker/Dockerfile.prod -t app/web:prod . |
| 路径基准 | -f 相对当前工作目录解析 |
| 上下文 | 命令末尾的路径,COPY 的源相对它解析 |
| 常见组织方式 | docker/ 目录下并存 Dockerfile.dev、Dockerfile.prod 等多套 |
典型使用场景
- 一套代码多套构建方式:开发镜像带调试工具,生产镜像只装运行依赖
- 把 Dockerfile 集中放在 docker 目录,保持仓库根目录整洁
- CI 里按分支或环境选择不同 Dockerfile,一条流水线复用
- 构建不同角色的镜像:应用镜像与迁移工具镜像共用一份上下文
- 排查构建差异时确认 CI 与本地用的是不是同一个 Dockerfile
- 给审计留档:把 Dockerfile 与构建命令一并归档,复现问题更快
示例
示例
docker build -f docker/Dockerfile.prod -t app/web:prod .
docker build -f docker/Dockerfile.dev -t app/web:dev .
docker build -f docker/Dockerfile.prod --target build -t app/web:deps .
# 文件名不以 Dockerfile 开头时必须显式指定,例如 app.Dockerfile
docker build -f docker/app.Dockerfile -t app/web:alt .两个路径别搞混
| 参数 | 相对谁解析 | 常见错误 |
|---|---|---|
| -f 指定的文件 | 当前工作目录 | 路径按上下文写,结果报文件不存在 |
| 上下文(末尾路径) | 当前工作目录 | 漏写点号,把目录名当成额外参数 |
| COPY 的源 | 构建上下文根 | 以为相对 Dockerfile 所在目录,找不到文件 |
| COPY 的目标 | 镜像内路径 | 写成相对路径时基于 WORKDIR 解析 |
Dockerfile 放在上下文目录之外时,COPY 依然只能访问上下文里的文件,需要同步调整上下文位置,或把要复制的文件挪进上下文。
文件名不以 Dockerfile 开头(如 app.Dockerfile)时必须用 -f 显式指定,构建器不会自动识别这类命名。
同一份上下文配多份 Dockerfile 时,改一个共享文件会让所有镜像都需要重建,CI 里要评估流水线的总耗时。