我目前有两个相同的Dockerfile,除了开头的一些ENV变量具有不同的值。我想将它们组合成一个Dockerfile,然后根据一个build-arg / ARG选择ENV变量。
我尝试过这样的事情,$ target是WIN还是UNIX:
FROM alpine
ARG target
ARG VAR1_WIN=Value4Win
ARG VAR1_UNIX=Value4Unix
ARG VAR1=VAR1_$target
ARG VAR1=${!VAR1}
RUN echo $VAR1
但是它会引发错误:failed to process "${!VAR1}": missing ':' in substitution
我做了很多尝试,但是无法将$VAR1
进行两次扩展。
如何正确执行此操作?谢谢。
答案 0 :(得分:2)
对于条件语法,有一种模式可用于多阶段构建:
# ARG defined before the first FROM can be used in FROM lines
ARG target
# first base image for WIN target
FROM alpine as base-WIN
# switching to ENV since ARG doesn't pass through to the next stage
ENV VAR1=Value4Win
# second base image for UNIX target
FROM alpine as base-UNIX
ENV VAR1=Value4Unix
# select one of the above images based on the value of target
FROM base-${target} as release
RUN echo $VAR1
答案 1 :(得分:0)
双展开语法${!VAR}
仅在bash
中有效,而Dockerfile
不能由shell解析。根据{{3}},Dockerfile
不支持双扩展。
请注意,alpine
使用ash
而不是bash
,因此它也不支持${!VAR}
。您必须使用eval
+ echo
。尝试RUN VAR1="$(eval "echo \$$VAR1")"; echo $VAR1
。
答案 2 :(得分:-1)
如果您无法直接通过Value4Win
传递Value4Unix
或--build-arg
,这是一种方法:
FROM alpine
ARG target
ARG VAR1=Value4${target}
RUN echo $VAR1
进行docker build --build-arg target=WIN .
可以得到:
Step 4/4 : RUN echo $VAR1
---> Running in 6e94bc28d459
Value4WIN