Build Docker avec paramètres

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 directive ARG,

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 .