You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在docker-compose.yml中传递文件内容作为构建参数?

解决Docker Compose构建参数传递文件内容的问题

这个问题我之前也碰到过!Docker Compose的YAML配置里确实不支持直接在args字段中执行$(cat)这类Shell命令——因为Compose的变量插值逻辑和原生Shell不同,它会把$()当成无效的插值格式,自然就会报你看到的错误。下面给你几个可行的解决方案:

方案1:通过环境变量传递(最直接)

先在Shell中把文件内容读取到环境变量里,再让Compose引用这个环境变量作为构建参数:

  1. 导出环境变量(临时生效,重启终端后需要重新执行):
export MY_FILE_CONTENT="$(cat $PATH_TO_MY_FILE)"
  1. 修改docker-compose.yml,直接引用这个环境变量:
build:
  context: .
  args:
    - MY_FILE=${MY_FILE_CONTENT}

之后执行docker-compose build就可以正常传递文件内容了。

方案2:结合.env文件(持久化配置)

如果不想每次都手动导出环境变量,可以把文件内容写入Compose默认读取的.env文件里。注意如果文件内容包含换行、引号等特殊字符,建议用Base64编码避免格式问题:

  1. 将文件内容编码后写入.env:
echo "MY_FILE_CONTENT=$(base64 -w 0 $PATH_TO_MY_FILE)" >> .env
  1. 在docker-compose.yml中引用环境变量:
build:
  context: .
  args:
    - MY_FILE=${MY_FILE_CONTENT}
  1. 在Dockerfile中解码并写入目标文件:
ARG MY_FILE
RUN echo "$MY_FILE" | base64 -d > /my-file

为什么原来的配置不行?

Docker Compose的YAML解析器会把$()当成它自己的变量插值语法(比如用来引用Compose内置变量或环境变量),而不是调用Shell执行命令。即使你尝试用$$()转义,也只会把它当成普通字符串传递,不会执行cat命令读取文件内容——这就是你之前尝试各种转义都无效的原因。

内容的提问来源于stack exchange,提问作者Daniel Gruszczyk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:13:12