2017-03-10 7 views
1

私はしばらくしてドッカーを使用しています。私はいくつかの条件に基づいてDockerファイルに存在する命令を実行する必要がある状況に遭遇しました。あなたは、私がMavenとアリの両方のインストール手順を持っている私のドッキングウィンドウのファイルで見ることができるように、例えばここにDockerfileドッカーの条件ブロック

FROM centos:centos7 
MAINTAINER Akshay <[email protected]> 

# 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 
...... 

の抜粋です。しかし、今は条件に基づいてどちらか一方をインストールする必要があります。私はDockerfileにARG命令を使用してビルド時に引数を取り出すことができることを知っていますが、if/elseブロックで囲む方法に関するドキュメントが見つかりませんでした。

私もこれに関するいくつかの他のStackOverflowの記事を読んでいるが、これらの中で、私は、彼らが命令などRUN if $BUILDVAR -eq "SO"; then export SOMEVAR=hello; else export SOMEVAR=world; fiLink、またはthis のような別のスクリプトファイルを書くの内部条件文を使用することを求めていることを確認しかし、あなたが見ることができるように、私の場合は異なっています。私はこの議論に依存することになる他の指示もたくさん持っているので、私たちはこれを作ることができません。私はあなたがあなたの代わりにセットアップ手順でbashスクリプトを作成し、Dockerfileからそれを呼び出すことができるすべてのものをRUN if文を使用しない場合は、この

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

ような何かをしなければなりません。たとえば、次のように

FROM centos:centos7 
MAINTAINER Someone <[email protected]> 

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)を使用して、それを構築することができます。

ここではシェルスクリプトを使用しましたが、他のインタープリタ(たとえばPythonやRubyなど)を使用できる場合は、それらを使用してセットアップスクリプトを記述することもできます。

+0

ご意見ありがとうございます。はい、私はこの解決策についても考えました。しかし問題は、その条件をチェックすると異なるドッカーの命令が実行されるはずだから、複数のスクリプトを用意する必要があるということです。つまり、 'setup.sh'を実行した後、再びその条件に基づいて' configure.sh'を実行し、 'execute.sh'などを実行するようになります。だから私はこのようにとても退屈なことになるでしょう。したがって、これを達成する他の方法があるかどうかが考えられます。私が間違っていれば私を修正してください。 – DMA

+0

"その条件をチェックすると異なるドッカーの命令が実行されるはずです"という具合に具体的な例を挙げることはできますか? – Salem

+0

私は、 'BUILD_TOOL'という引数を使って' setup.sh'以外の他の命令を実行する必要があるということを意味しています。たとえばMAVEN/ANTのいずれかをインストールした後のように、私はいくつかの一般的な指示を実行しなければなりません。また、 'BUILD_TOOL'に基づいて、設定が必要な他のものを決定しなければなりません。この方法では、前述のように 'RUN ./setup.sh RUN ./configure.sh RUN。/ execute.sh'と' if/else'を含むファイルになります。私が何を言おうとしていることを願っています。 – DMA

関連する問題