You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:45:40