gpt4 book ai didi

Dockerfile 覆盖 ARG 值

转载 作者:行者123 更新时间:2023-12-02 18:11:40 24 4
gpt4 key购买 nike

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com