Dockerfile覆盖参数值

Dockerfile覆盖参数值,docker,arguments,parameter-passing,Docker,Arguments,Parameter Passing,我有一个Dockerfile,其中包含Scala和SBT,如下所示: # 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 SB

我有一个Dockerfile,其中包含Scala和SBT,如下所示:

# 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
现在,如果我想使用它作为我的基础图像,我有以下问题:

  • 我是否可以覆盖新Dockerfile中的ARG参数,该文件将使用上面的参数作为基础映像

  • ARG
    值在生成时定义。
    构建基本映像后,您不能仅更改
    --build arg
    以在最终映像中获得另一个
    SCALA\u版本(或者必须在新的Dockerfile中重新安装)

    当前Dockerfile类似于其他Dockerfile的模板。

    您可以使用在构建其他映像时使用此映像作为基本映像来有效地进行安装。

    每个Dockerfile都会生成一个不可变的映像。因此,您需要首先构建一个特定的基本映像,然后从它构建您自己的

    您可以采取以下方法:

    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
    
    # 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
    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
    # ...
    # ...
    
    构建示例:

     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提到

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

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

    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
    

    我不能在继承的Dockerfile中重写它吗?是的,你可以。从编辑的Dockerfile生成新图像。是的,将从新Dockerfile生成新图像,但新Dockerfile不会传递这些参数,但会覆盖这些参数。据我所知,这样做似乎是可能的。我要试试看!我添加了有关
    ONBUILD
    指令的信息,该指令可能会帮助您无法更改已生成的映像。您可能会找到一些图像标记约定来解决这个问题。