2017-07-18 1 views
0

j'ai un Dockerfile qui a Scala et SBT comme ci-dessous:Dockerfile Ecraser ARG valeurs

# 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 

Maintenant, si je veux utiliser mon image de base, je pose la question suivante:

  1. Puis-je remplacer les paramètres ARG dans mon nouveau Dockerfile qui utilisera celui ci-dessus comme image de base?
+1

Une image qui est déjà construit ne peut pas être changé. Vous devriez probablement trouver une convention d'étiquette d'image qui résoudra ceci. – Grimmy

Répondre

1

Chaque fichier Dockerfile produit une image immuable. Donc, vous devez d'abord construire une image de base spécifique, puis créez votre propre FROM.

Vous pouvez prendre cette approche:

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 

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

exemple Créer:

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 

Approche 2, ONBUILD, mentionné par 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 

Votre enfant Dockerfile.mine

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

Construire:

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 
0

ARG Les valeurs sont définies au moment de la construction.
Une fois que votre image de base est construite, vous ne pouvez pas changer le --build-arg pour obtenir un autre SCALA_VERSION dans votre image finale (ou vous devez l'installer à nouveau en vous nouveau Dockerfile)

La présente Dockerfile est comme un modèle pour d'autres Dockerfile .
Vous pouvez utiliser le ONBUILD instruction pour effectuer les installations lors de la construction d'autres images en utilisant celui-ci comme image de base.

+0

Je ne peux pas le remplacer dans mon Dockerfile hérité? – sparkr

+0

Oui, vous pouvez. Construire une nouvelle image à partir du Dockerfile édité. – Vineeth

+0

Oui, il y aura une nouvelle image construite à partir du nouveau Dockerfile mais le nouveau Dockerfile ne passera pas ces arguments, mais ils les écraseront. D'après ce que je sais, il semble possible de le faire. Je vais essayer! – sparkr