如何在Dockerfile中用环境变量控制Python脚本的布尔Flag(无需改脚本)
问题描述
现有Python脚本如下:
import argparse parser = argparse.ArgumentParser() parser.add_argument("--host", required=True) parser.add_argument("--enabled", default=False, action="store_true") args = parser.parse_args() print("host: " + args.host) print("enabled: " + str(args.enabled))
执行示例:
$ python3 test.py --host test.com host: test.com enabled: False $ python3 test.py --host test.com --enabled host: test.com enabled: True
将该脚本打包进Docker镜像时,需通过docker run传递参数。目前--host参数已通过环境变量实现,Dockerfile内容如下:
FROM python:3.10-alpine ENV MY_HOST=default.com #ENV MY_ENABLED= ENV TZ=Europe/Berlin WORKDIR /usr/src/app COPY test.py . CMD ["sh", "-c", "python test.py --host ${MY_HOST}"]
现在需要实现--enabled标志的控制:当环境变量MY_ENABLED未设置、值为0或off等时,不添加该标志;否则将其加入CMD命令中,且不能修改原Python脚本,该如何实现?
解决方案
可以通过在sh -c的命令字符串中嵌入Shell条件判断,动态拼接--enabled参数,具体修改Dockerfile的CMD指令如下:
CMD ["sh", "-c", "python test.py --host ${MY_HOST} $(case ${MY_ENABLED:-} in 1|true|on|yes) echo '--enabled';; esac)"]
逻辑说明
${MY_ENABLED:-}:如果MY_ENABLED未设置,会被替换为空字符串,避免触发未定义变量的警告case语句匹配MY_ENABLED的取值:- 当值为
1、true、on、yes时,输出--enabled参数 - 其他情况(包括未设置、值为
0、off、false等),不输出任何内容
- 当值为
$(...)会把case语句的输出结果作为参数追加到Python命令后
使用示例
- 未设置
MY_ENABLED或设为无效值时:
docker run --rm my-image # 实际执行命令:python test.py --host default.com # 输出: # host: default.com # enabled: False
- 设置
MY_ENABLED为有效值时:
docker run --rm -e MY_ENABLED=1 my-image # 实际执行命令:python test.py --host default.com --enabled # 输出: # host: default.com # enabled: True
若偏好更简洁的写法,也可以用if判断实现:
CMD ["sh", "-c", "python test.py --host ${MY_HOST} ${MY_ENABLED:+$(echo ${MY_ENABLED} | grep -qE '^(1|true|on|yes)$' && echo '--enabled')}"]
两种写法功能一致,case语句的可读性更强,推荐使用第一种。
内容的提问来源于stack exchange,提问作者Basti
相关产品推荐
相关产品推荐

