webentwicklung-frage-antwort-db.com.de

Dockerfile: Ausgabe des RUN-Befehls in eine Variable

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
11
meallhour

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
20
Andy Shinn

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.

0
Chris

Ich habe dies speziell für das Drucken von Farben an die Konsole verwendet. Wenn Ihr Container Python enthält, können Sie Folgendes tun:

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