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

如何将docker-compose参数传递至Dockerfile内的Python脚本?

解决Docker-compose参数传递至Python脚本的问题

这个问题我之前也碰到过,核心原因是你用了CMD的exec数组格式,这种方式不会触发shell来解析环境变量,所以Python脚本拿到的就是字面量$INSTANCE_NUM而不是实际值。而RUN指令能正常打印,是因为RUN默认是在shell环境下执行的,会自动解析变量。

下面给你几个可行的解决办法:

方法1:改用CMD的shell格式

把CMD的数组形式改成字符串形式,这样Docker会启动一个shell来解析环境变量,再执行脚本:

CMD python test.py $INSTANCE_NUM $TOTAL_INSTANCES

这种方式最简单,适合大多数场景。不过要注意:如果你的Python脚本需要处理信号(比如docker stop发送的SIGTERM),shell可能会延迟转发信号,导致脚本不能及时退出。

方法2:通过shell执行exec格式的CMD

如果想保留exec模式的特性,同时让shell解析变量,可以用sh -c包裹命令:

CMD ["sh", "-c", "python test.py $INSTANCE_NUM $TOTAL_INSTANCES"]

这里整个命令作为sh -c的参数,shell会先解析其中的环境变量,再执行Python脚本。这种方式兼顾了exec模式和变量解析,是比较稳妥的选择。

方法3:让Python脚本直接读取环境变量

更简洁的方式是跳过命令行参数,直接在Python脚本里读取环境变量。修改你的test.py:

import os

# 从环境变量中获取参数
instance_num = os.environ.get("INSTANCE_NUM")
total_instances = os.environ.get("TOTAL_INSTANCES")

# 后续逻辑使用这两个变量
print(f"Instance num: {instance_num}, Total instances: {total_instances}")

然后Dockerfile里的CMD可以简化成:

CMD ["python", "test.py"]

这种方式避免了shell解析的问题,也让脚本的参数来源更清晰,推荐长期使用。

验证docker-compose的参数传递

最后确认你的docker-compose.yml里的build参数设置正确,确保ARG能传递到Dockerfile:

services:
  your-service-name:
    build:
      context: .
      args:
        INSTANCE_NUM: 1  # 你的实际参数值
        TOTAL_INSTANCES: 5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:28:00