Ich schreibe eine Docker-Datei und möchte die Ausgabe des Befehls "ls" in eine Variable wie folgt einfügen:
$file = ls /tmp/dir
Hier enthält "dir" nur eine Datei.
Die folgende RUN-Anweisung in einer Docker-Datei funktioniert nicht
RUN $file = ls /tmp/dir
Sie können eine Variable nicht zur späteren Verwendung in anderen Dockerfile
-Befehlen speichern (wenn dies Ihre Absicht ist). Dies liegt daran, dass jedes RUN
in einer neuen Shell auftritt.
Wenn Sie jedoch nur die Ausgabe von ls
erfassen möchten, sollten Sie dies in einem RUN
-Verbundbefehl ausführen können. Zum Beispiel:
RUN file="$(ls -1 /tmp/dir)" && echo $file
Oder verwenden Sie einfach die Subshell-Inline:
RUN echo $(ls -1 /tmp/dir)
Hoffe das hilft deinem Verständnis. Wenn Sie einen tatsächlichen Fehler oder ein zu lösendes Problem haben, könnte ich dies anstelle einer hypothetischen Antwort erweitern.
Ein vollständiges Beispiel Dockerfile
, das dies demonstriert, wäre:
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)
Beim Erstellen sollten Sie die Schritte 3 und 4 sehen, die die Variable ausgeben (die die Liste von file1
und file2
enthält, die in Schritt 2 erstellt werden):
$ 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
Ich konnte Andys (oder einen anderen) Ansatz nicht dazu bringen, in der Dockerfile selbst zu arbeiten, also setze ich meinen Dockerfile-Eingang auf eine bash-Datei, die Folgendes enthält:
#!/bin/bash
file="$(conda list --explicit)" && echo $file
echo $(conda list --explicit)
Beachten Sie, dass die zweite Methode keine Zeilenumbrüche darstellt. Daher habe ich die erste Methode gefunden - das Echo über die $file
-Variable - superior.