Docker容器通过-e传入的环境变量在entrypoint脚本中无法访问
你遇到的问题核心在于 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

