如何将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_
相关产品推荐
相关产品推荐

