Dockerfile覆盖ARG值

我有一个具有Scala和SBT的Dockerfile,如下所示:

# Scala and sbt Dockerfile # Scala and SBT forked from: https://github.com/hseeberger/scala-sbt # Adds Docker client installation additionally # Pull base image FROM openjdk:$JAVA_VERSION ARG SCALA_VERSION ARG SBT_VERSION # Scala expects this file RUN touch /usr/lib/jvm/java-$JAVA_VERSION-openjdk-amd64/release # Install Scala ## Piping curl directly in tar RUN \ curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /root/ && \ echo >> /root/.bashrc && \ echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc # Install sbt RUN \ curl -L -o sbt-$SBT_VERSION.deb http://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \ dpkg -i sbt-$SBT_VERSION.deb && \ rm sbt-$SBT_VERSION.deb && \ apt-get update && \ apt-get install sbt && \ sbt sbtVersion 

现在,如果我想用这个作为我的基本形象,我有以下问题:

  1. 我可以覆盖我的新的Dockerfile中的ARG参数,将使用上面的一个作为基础图像?

每个Dockerfile生成一个不可变的图像。 所以你需要先build立一个特定的基础图像,然后build立你自己的。

你可以采取这种方法:

Dockerfile.base

 # Scala and sbt Dockerfile # Scala and SBT forked from: https://github.com/hseeberger/scala-sbt # Adds Docker client installation additionally # Pull base image ARG JAVA_VERSION FROM openjdk:$JAVA_VERSION ARG SCALA_VERSION ARG SBT_VERSION # Scala expects this file RUN touch /usr/lib/jvm/java-$JAVA_VERSION-openjdk-amd64/release # Install Scala ## Piping curl directly in tar RUN \ curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /root/ && \ echo >> /root/.bashrc && \ echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc # Install sbt RUN \ curl -L -o sbt-$SBT_VERSION.deb http://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \ dpkg -i sbt-$SBT_VERSION.deb && \ rm sbt-$SBT_VERSION.deb && \ apt-get update && \ apt-get install sbt && \ sbt sbtVersion 

你的孩子Dockerfile Dockerfile.mine

 ARG JAVA_VERSION ARG SCALA_VERSION ARG SBT_VERSION FROM basejava:java-$JAVA_VERSION-scala-$SCALA_VERSION-sbt-$SBT_VERSION # Your app stuf here # ... # ... 

构build示例:

  export JAVA_VERSION=latest export SCALA_VERSION=1.8 export SBT_VERSION=0.13.9 docker build . \ -f Dockerfile.base \ --build-arg JAVA_VERSION=$JAVA_VERSION \ --build-arg SCALA_VERSION=$SCALA_VERSION \ --build-arg SBT_VERSION=$SBT_VERSION \ -t basejava:java-$JAVA_VERSION-scala-$SCALA_VERSION-sbt-$SBT_VERSION docker build . \ -f Dockerfile.mine \ --build-arg JAVA_VERSION=latest \ --build-arg SCALA_VERSION=1.8 \ --build-arg SBT_VERSION=0.13.9 -t myjava:java-$JAVA_VERSION-scala-$SCALA_VERSION-sbt-$SBT_VERSION 

方法2 ,由Zigarn提到的ONBUILD。

Dockerfile.base

 # Scala and sbt Dockerfile # Scala and SBT forked from: https://github.com/hseeberger/scala-sbt # Adds Docker client installation additionally # Pull base image ONBUILD ARG JAVA_VERSION FROM openjdk:$JAVA_VERSION ONBUILD ARG SCALA_VERSION ONBUILD ARG SBT_VERSION # Scala expects this file ONBUILD RUN touch /usr/lib/jvm/java-$JAVA_VERSION-openjdk-amd64/release # Install Scala ## Piping curl directly in tar ONBUILD RUN \ curl -fsL http://downloads.typesafe.com/scala/$SCALA_VERSION/scala-$SCALA_VERSION.tgz | tar xfz - -C /root/ && \ echo >> /root/.bashrc && \ echo 'export PATH=~/scala-$SCALA_VERSION/bin:$PATH' >> /root/.bashrc # Install sbt ONBUILD RUN \ curl -L -o sbt-$SBT_VERSION.deb http://dl.bintray.com/sbt/debian/sbt-$SBT_VERSION.deb && \ dpkg -i sbt-$SBT_VERSION.deb && \ rm sbt-$SBT_VERSION.deb && \ apt-get update && \ apt-get install sbt && \ sbt sbtVersion 

你的孩子Dockerfile.mine

 FROM basejava # Base ONLBUILD instructions are automatically inserted here. # Your app stuf here # ... # ... 

build立:

 docker build . -f Dockerfile.base -t basejava export JAVA_VERSION=latest export SCALA_VERSION=1.8 export SBT_VERSION=0.13.9 docker build . \ -f Dockerfile.mine \ --build-arg JAVA_VERSION=$JAVA_VERSION \ --build-arg SCALA_VERSION=$SCALA_VERSION \ --build-arg SBT_VERSION=$SBT_VERSION \ -t myjava:java-$JAVA_VERSION-scala-$SCALA_VERSION-sbt-$SBT_VERSION 

ARG值在构build时定义。
一旦你的基础镜像被构build,你不能只改变--build-arg在你的最终镜像中获得另一个SCALA_VERSION (或者你必须在你的新Dockerfile中再次安装它)

目前的Dockerfile就像是其他Dockerfile的模板。
您可以使用ONBUILD指令在构build其他图像的过程中有效地进行安装,将其作为基础图像。