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

Docker容器通过-e传入的环境变量在entrypoint脚本中无法访问

问题根源:sudo 默认会清除环境变量

你遇到的问题核心在于 sudo 的默认行为会重置大部分环境变量。当你通过 docker run -e 设置的环境变量,在容器内直接用 exec /bin/bash 时是能读到的——因为这时你是以容器默认的 root 用户(或者启动容器的用户)运行 shell,环境变量保留着。但你的 ENTRYPOINT 用了 sudo,sudo 为了安全,会过滤掉大部分非安全的环境变量,导致你的 starter-service.sh 脚本读不到 LICENSE_KEY。


解决方案:三种可选方案

方案一:去掉 sudo(最推荐)

Docker 容器默认是以 root 用户运行的,完全没必要用 sudo 来执行脚本。直接修改你的 Dockerfile 里的 ENTRYPOINT:

修改后的 Dockerfile:

FROM debian:9
RUN apt-get update && apt-get install -y curl sudo supervisor wget
ADD starter-service.sh .
RUN chmod 755 starter-service.sh
ENTRYPOINT ["./starter-service.sh"]

这样脚本会直接以 root 用户执行,环境变量能正常传递,LICENSE_KEY 就能被脚本读取到了。

方案二:保留 sudo,但添加 -E 参数

如果你确实需要用 sudo(比如脚本要切换到其他用户执行,不过当前场景看起来不需要),可以给 sudo 添加 -E 参数,它会强制保留当前用户的环境变量:

修改 Dockerfile 的 ENTRYPOINT:

ENTRYPOINT ["sudo", "-E", "/bin/bash", "-c", "./starter-service.sh"]

方案三:配置 sudo 永久保留指定环境变量

可以在 Dockerfile 里修改 sudo 的配置,让它始终保留 LICENSE_KEY:

在 Dockerfile 中添加一行:

RUN echo 'Defaults env_keep += "LICENSE_KEY"' >> /etc/sudoers

这样即使不用 -E,sudo 也会保留这个环境变量。如果需要保留多个变量,可以用空格分隔,比如 env_keep += "LICENSE_KEY OTHER_VAR"。


验证方法

修改后重新构建镜像,运行:

docker run -e LICENSE_KEY=123 <你的镜像名>

然后进入容器查看日志:

docker exec -it <容器ID> cat /tmp/my-service.log

如果日志里能看到 LICENSE_KEY=123,说明问题解决了。

内容的提问来源于stack exchange,提问作者tipra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:47:08