Dockerfile if else 条件与外部参数

新手上路,请多包涵

我有 dockerfile

 FROM centos:7
ENV foo=42

然后我建立它

docker build -t my_docker .

并运行它。

 docker run -it -d  my_docker

是否可以从命令行传递参数并将其与 Dockerfile 中的 if else 一起使用?我的意思是

FROM centos:7
if (my_arg==42)
     {ENV=TRUE}
else:
     {ENV=FALSE}

并用这个论点构建。

  docker build -t my_docker . --my_arg=42

原文由 nick_gabpe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

它可能看起来不那么干净,但你可以让你的 Dockerfile(有条件的)如下:

 FROM centos:7
ARG arg
RUN if [[ -z "$arg" ]] ; then echo Argument not provided ; else echo Argument is $arg ; fi

然后将图像构建为:

docker build -t my_docker . --build-arg arg=45

或者

docker build -t my_docker .

原文由 Qasim Sarfraz 发布,翻译遵循 CC BY-SA 4.0 许可协议

提出的解决方案有一个有趣的替代方案,它与 单个 Dockerfile 一起 工作,每个条件构建只需要 一次调用 docker build 并 避免 bash

解决方案:

以下 Dockerfile 解决了这个问题。复制粘贴并自己尝试。

 ARG my_arg

FROM centos:7 AS base
RUN echo "do stuff with the centos image"

FROM base AS branch-version-1
RUN echo "this is the stage that sets VAR=TRUE"
ENV VAR=TRUE

FROM base AS branch-version-2
RUN echo "this is the stage that sets VAR=FALSE"
ENV VAR=FALSE

FROM branch-version-${my_arg} AS final
RUN echo "VAR is equal to ${VAR}"

Dockerfile的解释:

我们首先得到一个 base 图像(在您的情况下为 centos:7 )并将其放入自己的阶段。 base 阶段应该包含你想要在条件之前做的事情。之后,我们还有两个阶段,代表我们条件的分支: branch-version-1branch-version-2 。我们建立了他们两个。 final 阶段比选择这些阶段之一,基于 my_arg 。有条件的 Dockerfile。你去吧。

运行时输出:

(我把这个缩写了一点……)

my_arg==2

 docker build --build-arg my_arg=2 .
Step 1/12 : ARG my_arg
Step 2/12 : ARG ENV
Step 3/12 : FROM centos:7 AS base
Step 4/12 : RUN echo "do stuff with the centos image"
do stuff with the centos image
Step 5/12 : FROM base AS branch-version-1
Step 6/12 : RUN echo "this is the stage that sets VAR=TRUE"
this is the stage that sets VAR=TRUE
Step 7/12 : ENV VAR=TRUE
Step 8/12 : FROM base AS branch-version-2
Step 9/12 : RUN echo "this is the stage that sets VAR=FALSE"
this is the stage that sets VAR=FALSE
Step 10/12 : ENV VAR=FALSE
Step 11/12 : FROM branch-version-${my_arg}
Step 12/12 : RUN echo "VAR is equal to ${VAR}"
VAR is equal to FALSE

my_arg==1

 docker build --build-arg my_arg=1 .
...
Step 11/12 : FROM branch-version-${my_arg}
Step 12/12 : RUN echo "VAR is equal to ${VAR}"
VAR is equal to TRUE

感谢 Tõnis 提出这个惊人的想法!

原文由 User12547645 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题