dockerfile 单行 env 设置多个值问题

2021-10-28 18:00:37 +08:00
 pydiff

在写 dockerfile 的时候遇到了一个写单行 env 设置多个值,其中有值会丢失,如

FROM alpine:3.13.6
COPY jre/ /usr/local/jre/openjre8-302/
ENV JAVA_HOME="/usr/local/jre/openjre8-302" 
ENV PATH="$PATH:$JAVA_HOME/bin"  
ENV CLASSPATH=".:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"

则运行容器时输入 java 正常.如果我这样写

FROM alpine:3.13.6
COPY jre/ /usr/local/jre/openjre8-302/
ENV JAVA_HOME="/usr/local/jre/openjre8-302" \
    PATH="$PATH:$JAVA_HOME/bin"  \
    CLASSPATH=".:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"

在容器中输入 java 则提示命令不存在,在输入 env 查看发现 PATH 这个环境变量丢失了. 因为我要部署的程序要设置的环境变量比较多,所以想通过一个 ENV 而不是多个来写 dockerfile, 我查了百度跟 google,都没有找到有用的解决方案,请大佬们指点下

1400 次点击
所在节点    问与答
14 条回复
777777
2021-10-28 18:04:54 +08:00
少了 && ,\ 改成&&\
pydiff
2021-10-28 18:14:09 +08:00
@777777 不行,直接报语法错误,或者你写一个我试试
lululau
2021-10-28 18:22:07 +08:00
leafre
2021-10-28 19:07:30 +08:00
多个 ENV 逼死强迫症的故事
pydiff
2021-10-28 19:26:24 +08:00
@lululau 没用,不信你可以试试的
pydiff
2021-10-28 19:28:03 +08:00
@lululau 它是你写多个时,有些可以,有些则丢失了,所以我也很纳闷,估计是需要某种格式的
pydiff
2021-10-28 19:28:48 +08:00
@leafre 有点吧,不想写多个 ENV,不好看
yzbythesea
2021-10-28 19:32:19 +08:00
直接套个启动脚本在里面赋值环境变量
pydiff
2021-10-28 19:35:47 +08:00
@yzbythesea 这个是可以,不过我现在也想知道我单行设置多个 ENV 不生效究竟是什么原因
killva4624
2021-10-28 19:58:58 +08:00
一个从测试结果出发的结论:自定义的 ENV 必须在下一行 ENV 才能引用。
比如你改成这样就可以了:
ENV JAVA_HOME="/usr/local/jre/openjre8-302"
ENV PATH="$PATH:$JAVA_HOME/bin" \
CLASSPATH=".:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
pydiff
2021-10-28 20:29:25 +08:00
@killva4624 是的,但是这种还是不够问美观
jim9606
2021-10-28 21:49:30 +08:00
我不明白多行 ENV 有什么问题,怎么不美观了?
RUN 写成一大块是为了不在层之间遗留没用的中间文件,减少镜像体积,但 ENV 没这问题啊。
pydiff
2021-10-28 21:52:21 +08:00
@jim9606 是的,除了 RUN ADD COPY,其他的都不会增加 layer
mritd
2021-10-28 22:41:55 +08:00
我看着写多行的才更难受😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/811325

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX