Docker中的条件块

时间:2017-03-10 13:06:09

标签: docker dockerfile

我从一段时间以来一直在使用码头工具。我遇到过一种情况,我需要根据某些条件执行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指令在构建时获取参数,但问题是我找不到任何关于如何将它们封装在if/else块中的文档。 / p>

我已经阅读了很多关于此的其他stackoverflow帖子,但在那些我看到他们已经要求在指令中使用条件语句,例如RUN if $BUILDVAR -eq "SO"; then export SOMEVAR=hello; else export SOMEVAR=world; fi Link,或者写一个单独的脚本文件,如this 但正如你所看到的,我的情况有所不同。我无法告诉我们这一点,因为我还有一堆其他的指令也会依赖于这个论点。我必须做这样的事情

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

1 个答案:

答案 0 :(得分:2)

如果您不想使用所有这些RUN if语句,则可以使用设置过程创建一个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 .(或ANT)构建它。

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