Dockerfile配置ARG运行Python脚本参数缺失报错,需适配Kubernetes配置
问题根因
你确实对Docker ARG 指令的作用域存在理解误区:ARG 是构建时变量,仅在 docker build 执行的镜像构建阶段生效,镜像构建完成后 ARG 定义的变量就会被销毁,不会保留到容器运行阶段。
你现在的CMD指令执行时,所有${top_k}这类变量都会被解析为空值,实际执行的命令为 python3 detect.py --top_k --threshold --broker ...,参数位为空自然会抛出--top_k缺少参数的报错。
正确实现方案
你需要在运行时调整参数、且支持后续在Kubernetes配置中修改的场景,应该使用 ENV 指令,ENV 定义的是环境变量,会持久保存在镜像中,容器运行阶段也可以正常读取和覆盖。
如果需要保留构建时可自定义默认值的能力,可以通过 ARG 给 ENV 传值,修改后的Dockerfile参考如下:
FROM python:3.7 WORKDIR /app # Install python dependencies ADD requirements.txt /app/ RUN pip3 install --upgrade pip RUN pip3 install -r requirements.txt # Copy sources ADD . /app # 定义构建时参数,支持docker build时通过--build-arg修改默认值 ARG top_k=5 ARG threshold=0.5 ARG broker=broker.mqttdashboard.com ARG port=8000 ARG topic=topic/truc # 将构建参数赋值给运行时生效的环境变量 ENV TOP_K=${top_k} ENV THRESHOLD=${threshold} ENV BROKER=${broker} ENV PORT=${port} ENV TOPIC=${topic} # Run detection CMD python3 detect.py --top_k ${TOP_K} --threshold ${THRESHOLD} --broker ${BROKER} --port ${PORT} --topic ${TOPIC}
使用方式
- 构建镜像时修改默认值:
docker build --build-arg top_k=10 -t detect-app . - 本地运行容器时临时调整参数:
docker run -e TOP_K=8 -e THRESHOLD=0.6 detect-app - Kubernetes配置中调整参数,直接在容器的env字段下赋值即可:
apiVersion: apps/v1 kind: Deployment metadata: name: detect-app-deployment spec: replicas: 1 template: spec: containers: - name: detect-app image: detect-app:latest env: - name: TOP_K value: "8" - name: THRESHOLD value: "0.6"
内容的提问来源于stack exchange,提问作者Manitoba
相关产品推荐
相关产品推荐

