我有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

当前回答

接受的答案可以解决这个问题,但是如果你想在dockerfile中有多行if条件,你可以把\放在每行的末尾(类似于你在shell脚本中的做法),并以;结尾每个命令。您甚至可以将set -eux之类的命令定义为第一个命令。

例子:

RUN set -eux; \
  if [ -f /path/to/file ]; then \
    mv /path/to/file /dest; \
  fi; \
  if [ -d /path/to/dir ]; then \
    mv /path/to/dir /dest; \
  fi

在你的情况下:

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=42

其他回答

# FROM前面的ARGs用于图像 ARG IMLABEL=xxxx \ IMVERS = x.x 从$ {IMLABEL}: $ {IMVERS} # FROM后面的ARGs是用于脚本中使用的参数 ARG condition-x RUN if ["$condition-x" = "condition-1"];然后\ 回声“condition 1美元”;\ Elif ["$condition-x" = "condition-1"];然后\ 回声“情况2美元”;\ 其他的 回声“condition-others美元”;\ fi

build -t——build-arg IMLABEL——build-arg IMVERS——build-arg condition-x -f Dockerfile -t image:版本号。

对于任何试图构建基于Windows的映像的人,您需要访问参数%%的cmd。

# Dockerfile Windows
# ...
ARG SAMPLE_ARG
RUN if %SAMPLE_ARG% == hello_world ( `
    echo hehe %SAMPLE_ARG% `
    ) else ( `
    echo haha %SAMPLE_ARG% `
)
# ...

顺便说一下,ARG声明必须放在FROM之后,否则参数将不可用。

出于某种原因,这里的大多数答案都没有帮助我(可能与Dockerfile中的From图像有关)

所以我更喜欢在我的工作空间中结合——build-arg创建一个bash脚本,以便在Docker构建时通过检查参数是否为空来处理if语句

Bash脚本:

#!/bin/bash -x

if test -z $1 ; then 
    echo "The arg is empty"
    ....do something....
else 
    echo "The arg is not empty: $1"
    ....do something else....
fi

Dockerfile:

FROM ...
....
ARG arg
COPY bash.sh /tmp/  
RUN chmod u+x /tmp/bash.sh && /tmp/bash.sh $arg
....

码头工人构建:

docker build --pull -f "Dockerfile" -t $SERVICE_NAME --build-arg arg="yes" .

注意:这将被用于bash脚本中的else (false)

docker build --pull -f "Dockerfile" -t $SERVICE_NAME .

备注:这将进入if (true)

编辑1:

经过几次尝试,我找到了下面的文章和这一篇 这让我明白了两件事:

1) FROM之前的ARG在构建之外

2)默认shell是/bin/sh,这意味着if else在docker构建中有一点不同。例如,你只需要一个“=”而不是“==”来比较字符串。

你可以在Dockerfile里面做这个

ARG argname=false   #default argument when not provided in the --build-arg
RUN if [ "$argname" = "false" ] ; then echo 'false'; else echo 'true'; fi

在docker构建中:

docker build --pull -f "Dockerfile" --label "service_name=${SERVICE_NAME}" -t $SERVICE_NAME --build-arg argname=true .

根据docker build命令的文档,有一个名为——build-arg的参数。

使用示例:

docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .

在我看来,这正是你所需要的:)

正如其他人所说,shell脚本会有所帮助。

只是一个额外的情况,恕我直言,值得一提的是(对于无意中发现这里的人来说,寻找一个更简单的情况),那就是环境替换。

Environment variables (declared with the ENV statement) can also be used in certain instructions as variables to be interpreted by the Dockerfile. The ${variable_name} syntax also supports a few of the standard bash modifiers as specified below: ${variable:-word} indicates that if variable is set then the result will be that value. If variable is not set then word will be the result. ${variable:+word} indicates that if variable is set then word will be the result, otherwise the result is the empty string.