web-dev-qa-db-fra.com

Dockerfile: Sortie de l'instruction RUN dans une variable

J'écris un fichier docker et veux placer le résultat de la commande "ls" dans une variable, comme indiqué ci-dessous:

$file = ls /tmp/dir

Ici, "dir" ne contient qu'un fichier.

L'instruction RUN suivante dans un fichier de docker ne fonctionne pas

RUN $file = ls /tmp/dir
11
meallhour

Vous ne pouvez pas enregistrer une variable pour une utilisation ultérieure dans d'autres commandes Dockerfile (si tel est votre intention). En effet, chaque RUN se produit dans un nouveau shell.

Cependant, si vous voulez simplement capturer la sortie de ls, vous devriez pouvoir le faire en une seule commande RUN compound. Par exemple:

RUN file="$(ls -1 /tmp/dir)" && echo $file

Ou simplement en utilisant le sous-shell en ligne:

RUN echo $(ls -1 /tmp/dir)

J'espère que cela aide votre compréhension. Si vous avez une erreur réelle ou un problème à résoudre, je pourrais développer ceci au lieu d’une réponse hypothétique.

Un exemple complet Dockerfile démontrant ceci serait:

FROM Alpine:3.7
RUN mkdir -p /tmp/dir && touch /tmp/dir/file1 /tmp//dir/file2
RUN file="$(ls -1 /tmp/dir)" && echo $file
RUN echo $(ls -1 /tmp/dir)

Lors de la construction, vous devriez voir les étapes 3 et 4 sortir la variable (qui contient la liste de file1 et file2 créée à l’étape 2):

$ docker build --no-cache -t test .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM Alpine:3.7
 ---> 3fd9065eaf02
Step 2/4 : RUN mkdir -p /tmp/dir && touch /tmp/dir/file1 /tmp//dir/file2
 ---> Running in abb2fe683e82
Removing intermediate container abb2fe683e82
 ---> 2f6dfca9385c
Step 3/4 : RUN file="$(ls -1 /tmp/dir)" && echo $file
 ---> Running in 060a285e3d8a
file1 file2
Removing intermediate container 060a285e3d8a
 ---> 2e4cc2873b8c
Step 4/4 : RUN echo $(ls -1 /tmp/dir)
 ---> Running in 528fc5d6c721
file1 file2
Removing intermediate container 528fc5d6c721
 ---> 1be7c54e1f29
Successfully built 1be7c54e1f29
Successfully tagged test:latest
20
Andy Shinn

L'approche d'Andy (ou de toute autre personne) ne pouvant pas fonctionner dans le fichier Docker lui-même, j'ai donc défini mon point d'entrée Dockerfile dans un fichier bash contenant:

#!/bin/bash
file="$(conda list --explicit)" && echo $file
echo $(conda list --explicit)

Notez que la seconde méthode ne rend pas les sauts de ligne, j'ai donc trouvé la première méthode - echo via la variable $file - superior.

0
Chris

J'ai utilisé cela spécialement pour imprimer des couleurs sur console . Si votre conteneur contient du python, vous pouvez faire:

python -c 'print(" \033[31m RED TEXT \033[0m ")'
python -c 'print(" \033[32m GREEN TEXT \033[0m ")'
python -c 'print(" \033[34m BLUE TEXT \033[0m ")'

 enter image description here

0
Matt Andrzejczuk