根据构建ARG在Dockerfile中选择ENV / ARG

时间:2019-08-15 21:39:14

标签: docker dockerfile

我目前有两个相同的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进行两次扩展。 如何正确执行此操作?谢谢。

3 个答案:

答案 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