Dockerfile 覆盖 ARG 值

标签 docker arguments parameter-passing

我有一个包含 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

现在,如果我想使用它作为我的基本图像,我有以下问题:
  • 我可以覆盖我的新 Dockerfile 中的 ARG 参数,它将使用上述参数作为基础镜像吗?
  • 最佳答案

    每个 Dockerfile 都会生成一个不可变的镜像。所以你需要先构建一个特定的基础镜像,然后再构建自己的 FROM它。

    您可以采用这种方法:
    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
    

    您的 child 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
    

    方法二 , ONBUILD, 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
    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
    

    您的 child 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
    

    关于Dockerfile 覆盖 ARG 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45157895/

    相关文章:

    java - 在不传递参数的情况下从同一类中的其他方法访问 ArrayList 的方法?

    c - 不兼容的指针类型错误 [C]

    java - 加载 FXML 时将参数传递给 Controller

    docker - 更改静态目录的所有权在kubernetes中不起作用

    python-3.x - 运行 docker 镜像时无法访问提供的 localhost url

    typescript - Typescript 中的参数与选项

    c# - 在表单之间传递数组并在数组中管理

    r - 在R data.table中,如何将变量参数传递给表达式?

    node.js - Intellij 可以与 Visual-Studio-Code 样式的 docker devcontainer 一起使用吗?

    node.js - docker 上的微服务 - 架构