如何在Dockerfile中正确读取环境变量?运行时参数未生效排查
问题根源与解决方案
这个坑我踩过好多次了!你的问题核心在于Docker的ENTRYPOINT使用数组(exec)形式时,不会通过shell解析环境变量——也就是说你写的${dbconfig}根本没被替换成你docker run时传递的环境变量值,而是直接作为字符串${dbconfig}传给了Java进程,自然识别成null了,和你有没有写ENV dbconfig ""完全没关系。
给你两个靠谱的解决办法:
方法一:改用Shell形式的ENTRYPOINT
直接把ENTRYPOINT写成shell命令格式,这样Docker会启动一个shell进程来解析环境变量:
FROM clojure:openjdk-8-lein-slim-buster ENTRYPOINT java -Ddbconfig=${dbconfig} -jar abc.jar server EXPOSE 8080
不过这种写法有个小问题:Java进程不会是容器的PID 1,可能无法正确接收停止信号(比如docker stop)。优化一下,用exec让Java进程成为PID 1:
FROM clojure:openjdk-8-lein-slim-buster ENTRYPOINT exec java -Ddbconfig=${dbconfig} -jar abc.jar server EXPOSE 8080
方法二:用Shell数组包裹exec形式
如果你更习惯数组写法,也可以用sh -c来包裹命令,让shell帮你解析变量:
FROM clojure:openjdk-8-lein-slim-buster ENTRYPOINT ["sh", "-c", "exec java -Ddbconfig=${dbconfig} -jar abc.jar server"] EXPOSE 8080
这里同样加了exec来保证信号能正确传递给Java进程。
之后再用你原来的命令启动容器:
docker run --rm -e dbconfig='{"somekey" "value"}' xyz/abc
${dbconfig}就会被正确替换成你传递的JSON字符串啦!
内容的提问来源于stack exchange,提问作者Kshitij Singh
相关产品推荐
相关产品推荐

