Docker环境变量无法在CMD中生效问题求助
Docker CMD环境变量不生效问题解决
我尝试通过docker run命令传递脚本名称,但该名称无法在Dockerfile的CMD命令中生效。相同配置在SpringBoot/Java项目中可正常运行,相关代码如下:
相关代码
Dockerfile
FROM python:3.8.8 RUN apt-get update && apt-get upgrade -y && \ apt-get install -y nodejs RUN apt-get install -y npm WORKDIR /rubix-kyc COPY . /rubix-kyc RUN pip install -r /rubix-kyc/requirements.txt ARG SCRIPT_NAME ENV SCRIPT_NAME ${SCRIPT_NAME} RUN mkdir -p video_recording/ RUN npm install RUN npm install elastic-apm-node --save EXPOSE 4443 CMD [ "npm", "run" , "${SCRIPT_NAME}"]
docker run脚本
docker run \ -e SCRIPT_NAME=start-local \ -p 4443:4443 $1
问题原因
你用了Docker的exec格式CMD(数组形式),这种执行方式不会启动shell,环境变量${SCRIPT_NAME}会被当作普通字符串传给npm run,自然找不到对应的脚本。而Java项目里大概率用了shell格式的CMD(字符串形式),shell会自动解析环境变量,所以能正常运行。
解决方法
方法1:改用shell格式CMD
把数组形式的CMD改成字符串,让Docker通过shell执行命令,自动解析环境变量:
CMD npm run ${SCRIPT_NAME}
方法2:显式调用shell执行(保留数组格式)
如果需要保留数组格式(比如要处理信号传递),可以显式调用shell来执行命令:
CMD [ "sh", "-c", "npm run ${SCRIPT_NAME}" ]
额外说明:如果只是运行时传递环境变量,Dockerfile里的ARG SCRIPT_NAME可以去掉,因为docker run -e会直接设置环境变量,ARG是构建时用的参数,和运行时变量无关(保留也不会有问题)。
内容的提问来源于stack exchange,提问作者sanketh s
相关产品推荐
相关产品推荐

