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

Dockerfile中如何将ARG构建参数传递给CMD作为脚本运行入参

问题核心原因

两个机制导致你直接传参失败:

  • ARG是仅构建阶段生效的变量,镜像构建完成后容器运行时默认读不到ARG传入的值
  • 你用的JSON数组格式(exec格式)的CMD不会启动shell做变量替换,直接写变量名会被当成普通字符串传递,不会解析成实际传入的值
实现方案

按以下逻辑修改Dockerfile即可满足需求:

  1. 先声明构建参数,再把ARG的值赋值给ENV环境变量——ENV变量会被保留到容器运行时,供启动命令读取
  2. 选择适配场景的CMD写法完成参数传递

可用Dockerfile示例

# 基础镜像替换成你实际使用的版本即可
FROM python:3.11-slim
WORKDIR /app
# 提前把业务脚本复制到镜像内
COPY script.py .

# 声明构建参数x
ARG x
# 将构建时传入的x值赋值给运行时可读取的环境变量
ENV INPUT_ARG=${x}

# 启动命令二选一即可
# 写法1:shell格式CMD,写法简单,适合不需要特殊信号处理的场景
CMD python3 script.py ${INPUT_ARG}

# 写法2:exec格式配合sh -c + exec,信号可以直接转发给Python进程(推荐,适配docker stop等正常信号流转场景)
# CMD ["sh", "-c", "exec python3 script.py ${INPUT_ARG}"]

构建&运行验证

你原来的构建命令不需要修改,直接执行即可:

docker build --build-arg x=somedata .

用构建好的镜像启动容器时不需要额外传参,就会自动执行你期望的命令:

python3 script.py somedata
常见错误写法避坑
  • 不要直接在exec格式CMD里写$x:比如CMD ["python3", "script.py", "$x"],这种写法Python收到的入参是字面量字符串$x,不会解析成你传入的somedata
  • 不要跳过ENV赋值直接在CMD里读ARG:ARG在构建完成后就会被清除,容器运行时根本不存在x这个变量,读出来是空值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:03:18