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
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
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.