On peut définir des arguments (ARG
) dans un fichier Dockerfile.
Ces arguments sont des variables utilisées au moment du build, ce qui les différencie des variables d’environnement (ENV
) qui sont utilisées au moment du run.
Définition d’un argument
Dans les exemples ci-dessous, j’utilise l’exemple de construction d’une image pour WildFly, à partir de son code source.
Grâce à un argument de construction, on va pouvoir isoler la version de WildFly qu’on veut utiliser.
FROM openjdk:11
MAINTAINER Alexis Hassler <alexis.hassler@sewatech.fr>
ARG WILDFLY_VERSION=24.0.1.Final
RUN (curl -skL http://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz | tar xfz -) && \
mv /wildfly-$WILDFLY_VERSION /wildfly && \
rm -r /wildfly/welcome-content && \
/wildfly/bin/add-user.sh --silent alexis hassler
COPY html /wildfly/welcome-content
EXPOSE 8080 8009 9990
ENTRYPOINT ["/wildfly/bin/standalone.sh"]
CMD ["-c", "standalone-full.xml"]
Ici, la variable WILDFLY_VERSION contient la version à télécharger au build.
On l’utilise comme une variable d’environnement (ENV
), avec le symbole $.
Pour construire une autre version, on la spécifie dans la commande de build.
~# docker build --build-arg WILDFLY_VERSION=11.0.0.Final -t sewatech/wildfly:11 .
Argument en tête
Contrairement aux variables d’environnement, les arguments peuvent être déclarés avant le FROM
.
De ce fait, l’image de base ou son tag, peut être défini sous forme d’argument de build.
ARG JDK_VERSION=11
FROM openjdk:11
MAINTAINER Alexis Hassler <alexis.hassler@sewatech.fr>
ARG WILDFLY_VERSION=24.0.1.Final
...
Ainsi, au moment du build, on peut choisir à la fois la version de WildFly et celle du JDK.
~# docker build --build-arg JDK_VERSION=8 --build-arg WILDFLY_VERSION=11.0.0.Final -t sewatech/wildfly:11_jdk8 .
Argument en tête multi-stage build
La portée d’un argument est le fichier Dockerfile
.
Dans un mutli-stage build, un argument peut donc être partagé entre les étapes.
Evidemment, ce build devrait être fait en 2 étapes :
ARG JDK_VERSION=11
# =====
FROM openjdk:$JDK_VERSION as wildfly-build
MAINTAINER Alexis Hassler <alexis.hassler@sewatech.fr>
ARG WILDFLY_VERSION=24.0.1.Final
RUN (curl -skL https://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz | tar xfz -) && \
mv /wildfly-$WILDFLY_VERSION /wildfly && \
rm -r /wildfly/welcome-content && \
/wildfly/bin/add-user.sh --silent alexis hassler
COPY html /wildfly/welcome-content
# =====
FROM openjdk:$JDK_VERSION
RUN groupadd -r wildfly -g 1000 && \
useradd -u 1000 -r -g wildfly -m -d /opt/wildfly -s /sbin/nologin -c "WildFly user" wildfly && \
chmod 755 /opt/wildfly
COPY --from=wildfly-build --chown=jboss:0 /wildfly /opt/wildfly
WORKDIR /opt/wildfly
USER wildfly
ENV LAUNCH_JBOSS_IN_BACKGROUND true
EXPOSE 8080 8009 9990
ENTRYPOINT ["bin/standalone.sh"]
CMD ["-c", "standalone-full.xml"]
Synthèse
En résumé,
-
on définit un argument de build dans le
Dockerfile
avec la directiveARG
,
ARG APP_VERSION=7.42
-
on l’utilise avec le symbole
$
,
RUN (curl -skL https://dl.sewa.tech/src/app-$APP_VERSION.tar.gz | tar xfz -)
-
on la modifie au build avec l’option
--build-arg
.
~# docker build --build-arg APP_VERSION=7.31 -t sewatech/app:7_31 .