Docker中的条件块

自从一段时间以来我一直在使用docker。 我遇到了一种情况,我需要根据某些条件执行Dockerfile中的指令。 例如这里是Dockerfile的片段

FROM centos:centos7 MAINTAINER Akshay <akshay@dm.com> # Update and install required binaries RUN yum update -y \ && yum install -y which wget openssh-server sudo java-1.8.0-openjdk \ && yum clean all #install Maven RUN curl -Lf http://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz -o /tmp/apache-maven-3.3.9.tar.gz RUN tar -xzf /tmp/apache-maven-3.3.9.tar.gz -C /opt \ && rm /tmp/apache-maven-3.3.9.tar.gz ENV M2_HOME "/opt/apache-maven-3.3.9" ENV PATH ${PATH}:${M2_HOME}/bin: # Install Ant ENV ANT_VERSION 1.9.4 RUN cd && \ wget -q http://archive.apache.org/dist/ant/binaries/apache-ant-${ANT_VERSION}-bin.tar.gz && \ tar -xzf apache-ant-${ANT_VERSION}-bin.tar.gz && \ mv apache-ant-${ANT_VERSION} /opt/ant && \ rm apache-ant-${ANT_VERSION}-bin.tar.gz ENV ANT_HOME /opt/ant ENV PATH ${PATH}:/opt/ant/bin ...... 

所以你可以在我的docker文件中看到我有maven和ant的安装说明。 但现在我必须根据条件安装其中一个。 我知道我可以在Dockerfile中使用ARG指令来在构build期间获取参数,但问题是我找不到关于如何将它们包含在if/else块中的任何文档。

我已经读了几个其他的stackoverflow的post,但是在那些我看到,他们已经要求在一个指令内使用条件语句,如RUN if $BUILDVAR -eq "SO"; then export SOMEVAR=hello; else export SOMEVAR=world; fi RUN if $BUILDVAR -eq "SO"; then export SOMEVAR=hello; else export SOMEVAR=world; fi RUN if $BUILDVAR -eq "SO"; then export SOMEVAR=hello; else export SOMEVAR=world; fi 链接 ,或像这样写一个单独的脚本文件但是,正如你所看到的,我的情况是不同的。 我不能让我们这样做,因为我也会有一堆其他的指示,这将依赖于这个论点。 我必须做这样的事情

 ARG BUILD_TOOL if [ "${BUILD_TOOL}" = "MAVEN" ]; then --install maven elif [ "${BUILD_TOOL}" = "ANT" ]; then --install ant fi .... other instructions .... if [ "${BUILD_TOOL}" = "MAVEN" ]; then --some other dependent commands elif [ "${BUILD_TOOL}" = "ANT" ]; then --some other dependent commands fi 

如果您不想使用所有这些RUN if语句,则可以使用设置过程创build一个bash脚本,并从Dockerfile中调用它。 例如:

 FROM centos:centos7 MAINTAINER Someone <someone@email.com> ARG BUILD_TOOL COPY setup.sh /setup.sh RUN ./setup.sh RUN rm /setup.sh 

setup.sh文件(不要忘记使其可执行文件):

 if [ "${BUILD_TOOL}" = "MAVEN" ]; then echo "Step 1 of MAVEN setup"; echo "(...)"; echo "Done MAVEN setup"; elif [ "${BUILD_TOOL}" = "ANT" ]; then echo "Step 1 of ANT setup"; echo "(...)"; echo "Done ANT setup"; fi 

你可以使用docker build --build-arg BUILD_TOOL=MAVEN . build来构build它docker build --build-arg BUILD_TOOL=MAVEN . (或ANT )。

请注意,我在这里使用了一个shell脚本,但是如果您有其他解释器可用(例如:python或ruby),您也可以使用它们来编写安装脚本。