输入可以来自管道
docker build 的构建输入可以来自标准输入:用 -f- 从管道读取 Dockerfile,用 - 作为上下文时则从标准输入读取一个 tar 流。它适合动态生成 Dockerfile 的流程,也适合把本地目录打包后送到远程构建,省去先同步文件的步骤。注意管道形式下排除规则由发送端控制,服务端不会再读 .dockerignore。
基本信息
| 用途 | Dockerfile 或构建上下文走标准输入 |
|---|---|
| Dockerfile 形式 | docker build -f- -t 名称 . < Dockerfile |
| 上下文形式 | tar czf - . | docker build -t 名称 - |
| 上下文要求 | 输入须为 tar 格式 |
| 排除规则 | 由发送端决定,服务端不读 .dockerignore |
典型使用场景
- 用模板或脚本动态生成 Dockerfile 后立即构建
- 跨主机构建:本地打包后通过管道送到远端守护进程
- CI 中避免把源码目录整体挂载或复制到构建机
- 只把需要的子目录打包发送,减少传输量
- 对比本地上下文与打包内容的差异,排查构建输入问题
两种管道用法
两种管道用法
docker build -f- -t app/web:gen . < Dockerfile.generated # Dockerfile 来自管道
tar czf - --exclude=node_modules --exclude=.git . | docker build -t app/web:1.0 - # 上下文走 tar 流
tar czf - . | tar tzf - | head # 先看打包进去的内容
docker build -f- . < Dockerfile.generated --progress=plain # 需要完整日志时打开进度输出使用形式对照
| 形式 | 写法 | 适用 |
|---|---|---|
| Dockerfile 走管道 | -f- 加重定向 | 按模板生成 Dockerfile 后立即构建 |
| 上下文走 tar 流 | 管道输入加 - 作为上下文 | 跨主机或需要精细裁剪源码 |
| 普通目录上下文 | . 作为上下文 | 常规构建,支持 .dockerignore |
| 远程构建 | 指定远程 context | 与 tar 流组合可减少同步步骤 |
管道形式下 .dockerignore 不会生效,必须在发送端把内容筛好,这一点与目录上下文的行为差别明显。
大仓库直接打包发送既耗带宽也拖慢构建,先排除依赖目录、构建产物与数据文件。
使用建议
- 先用普通目录上下文复现构建,再切到管道形式,排障路径更短
- 打包前用清单命令确认内容,把依赖目录与版本控制目录排除掉
- 动态生成的构建文件建议同时落盘留档,便于回溯当次的构建输入
- 跨主机发送时留意上下文体积与网络带宽,避免拖慢整条流水线