如何向Python 3.9 Docker镜像传入字符串类型命令行参数(CLA)
实现方案
一、现有Python脚本修正
现有脚本存在两处可优化点:一是漏导入sys模块,二是已经引入argparse做参数解析却直接读取sys.argv,可以优化为直接使用解析后的参数,规范度更高。
修正后的代码如下:
import sys if __name__ == '__main__': import argparse parser = argparse.ArgumentParser(description='Pass the variable needed') parser.add_argument('var', type=str, help='variable, support prod/test') args = parser.parse_args() ENVPath = '/usr/local/bin/chromedriver' if args.var == 'prod': currentvar = TestPrerequisiteService(ENVPath, prod) elif args.var == 'test': currentvar = TestPrerequisiteService(ENVPath, test) else: print("Invalid variable") exit(1)
二、容器启动时传入命令行参数
方案说明
通过Docker的ENTRYPOINT固定启动命令、CMD设置默认参数的方式,可以灵活实现启动时动态传参,比直接覆盖CMD的方式易用性更高。
Dockerfile修改
现有Dockerfile末尾的启动命令修改如下,同时可以删除开头冗余的ADD /app/main.py . ADD /app/Connect.py .,因为后续已经有COPY ./app ./app会把整个app目录复制到镜像内,避免文件冲突:
FROM python:3.9 # Chrome、chromedriver安装、依赖安装步骤保持不变 COPY requirements.txt . RUN pip install -r requirements.txt WORKDIR /microservices COPY ./app ./app # 固定启动命令 ENTRYPOINT ["python", "./app/main.py"] # 设置默认启动参数,启动容器不加参数时默认使用test CMD ["test"]
使用示例
- 构建镜像:
docker build -t test-app . - 启动时传入prod参数:
docker run --rm test-app prod - 不加参数启动时,自动使用默认的test参数:
docker run --rm test-app
三、镜像构建时传入字符串参数
如果需要在镜像构建阶段传入参数(比如设置默认运行环境、配置编译参数等),可以使用Docker的ARG指令实现:
Dockerfile修改示例
FROM python:3.9 # 定义构建参数,可同时设置默认值 ARG BUILD_ENV=test # 可选:把构建参数转为运行时环境变量,Python脚本中可通过os.environ直接读取 ENV APP_ENV=${BUILD_ENV} # 其余安装步骤保持不变 ENTRYPOINT ["python", "./app/main.py"] # 用构建参数设置默认启动参数 CMD [${BUILD_ENV}]
使用示例
构建时传入参数会覆盖ARG设置的默认值:docker build --build-arg BUILD_ENV=prod -t test-app .
内容的提问来源于stack exchange,提问作者Callum
相关产品推荐
相关产品推荐

