web-dev-qa-db-fra.com

Dockerfile: Définition de plusieurs variables d'environnement sur une seule ligne

J'avais l'impression que les variables environnementales pourraient être définies sur une seule ligne comme suit afin de minimiser les images intermédiaires.

FROM Alpine:3.6
ENV Ruby_MAJOR 2.4 \
    Ruby_VERSION 2.4.1 \
    Ruby_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654 \
    RUBYGEMS_VERSION 2.6.12 \
    BUNDLER_VERSION 1.15.3

Cependant, en exécutant un conteneur basé sur cet extrait de code et en appelant # set |grep RU, je constate que les variables ne sont pas affectées séparément, mais sont combinées en une seule chaîne.

Ruby_MAJOR='2.4     Ruby_VERSION 2.4.1     Ruby_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654     RUBYGEMS_VERSION 2.6.12     BUNDLER_VERSION 1.15.3'

Cependant, si je règle explicitement chaque variable comme ci-dessous, j'obtiens la sortie attendue et il n'y a pas d'erreur lors de l'appel des variables.

ENV Ruby_MAJOR 2.4
ENV Ruby_VERSION 2.4.1
ENV Ruby_DOWNLOAD_SHA256 4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654
ENV RUBYGEMS_VERSION 2.6.12
ENV BUNDLER_VERSION 1.15.3

Question: Est-il possible de combiner le réglage de variables d'environnement sur une seule ligne? Si oui, comment pourrais-je le faire? Et est-ce une bonne pratique?

48
BrianWilson

Il existe deux formats pour spécifier les environnements. Si vous avez besoin d'une seule variable, alors vous avez le format ci-dessous

ENV X Y

Ceci assignera X comme Y

ENX X Y Z

Ceci assignera X comme Y Z

Si vous devez affecter plusieurs variables d’environnement, utilisez l’autre format.

ENV X=Y Z=A

Ceci assignera X comme Y et Z comme A. Donc, votre Dockerfile devrait être

FROM Alpine:3.6
ENV Ruby_MAJOR=2.4 \
    Ruby_VERSION=2.4.1 \
    Ruby_DOWNLOAD_SHA256=4fc8a9992de3e90191de369270ea4b6c1b171b7941743614cc50822ddc1fe654 \
    RUBYGEMS_VERSION=2.6.12 \
    BUNDLER_VERSION=1.15.3

RUN env
86
Tarun Lalwani

Vous n'avez pas à vous soucier de nombreuses commandes ENV créant chacune un nouveau calque intermédiaire pour votre image finale créée par votre fichier Docker.

de Meilleures pratiques pour l'écriture de Dockerfiles

Minimiser le nombre de couches

Avant Docker 17.05, et plus encore avant Docker 1.10, il était important de minimiser le nombre de calques dans votre image. Les améliorations suivantes ont atténué ce besoin:

  • Dans Docker 1.10 et versions ultérieures, seules les instructions RUN, COPY et ADD créent des calques. D'autres instructions créent des images intermédiaires temporaires et n'augmentent plus directement la taille de la construction.

  • Docker 17.05 et versions ultérieures prennent en charge constructions à plusieurs étapes , qui vous permettent de copier uniquement les artefacts dont vous avez besoin dans l'image finale. Cela vous permet d'inclure des outils et des informations de débogage dans vos étapes de construction intermédiaires sans augmenter la taille de l'image finale.

3
Mike Lippert