首页/云/Docker 容器速查/从 stdin 提供 Dockerfile 或上下文
镜像与构建107 条

从 stdin 提供 Dockerfile 或上下文

构建输入可以来自标准输入:-f- 从管道读 Dockerfile,上下文也可以传 tar 流,适合生成式构建与远程流水线。

Docker 容器速查云更新于 2026-10-13

输入可以来自管道

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 不会生效,必须在发送端把内容筛好,这一点与目录上下文的行为差别明显。
大仓库直接打包发送既耗带宽也拖慢构建,先排除依赖目录、构建产物与数据文件。

使用建议

  • 先用普通目录上下文复现构建,再切到管道形式,排障路径更短
  • 打包前用清单命令确认内容,把依赖目录与版本控制目录排除掉
  • 动态生成的构建文件建议同时落盘留档,便于回溯当次的构建输入
  • 跨主机发送时留意上下文体积与网络带宽,避免拖慢整条流水线

易错点

  • 期望服务端按 .dockerignore 过滤:管道输入没有该机制,多余文件会原样进入构建上下文
  • 把 .git 与依赖目录一起发送:上下文体积暴涨,镜像层与缓存也更容易失效
  • tar 流里包含绝对路径或上层目录:上下文结构可能错乱,发送前先核对包内清单
  • 动态 Dockerfile 出错时仍坚持用管道排障:可先落盘成文件用普通方式复现,再切回管道形式

数据来源与参考

  • Docker 官方 CLI 参考:docker build(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌