Wie kommt es, dass folgendes, dh $PATH
direktes Echo von bash -c
:
docker exec -i -t my_container bash -c "echo $PATH"
Gibt einen anderen Wert $PATH
als den folgenden zurück, dh eine interaktive Bash-Sitzung wird gestartet und das $PATH
?
docker exec -i -t my_container bash
root@21e6d898c3c2:/# echo $PATH
Um dieser Frage einen Kontext zu geben, möchte ich einen Befehl im Container mit ausführen. docker exec
Dieser Befehl befindet sich auf dem Pfad, wenn ich eine interaktive Bash-Sitzung starte, aber nicht, wenn ich nur den Befehl ausführe.
Die Verwendung des vollständigen Pfads der ausführbaren Datei ist in diesem Fall keine Problemumgehung, da der Befehl auf anderen Umgebungsvariablen basiert, die genau wie PATH
in einer interaktiven Bash-Sitzung festgelegt wurden, jedoch nicht, wenn ich den Befehl direkt ausführe.
docker ... "echo $PATH"
wird , geschweige denn die Bash-Shell. Wenn Sie möchten, dass der PATH der Shell unter Docker ausgeführt wird, verwenden Sie einfache Anführungszeichen ( ), um eine vorzeitige Auswertung der PATH-Variablen zu verhindern.docker ... 'echo $PATH'
Antworten:
Wenn
-c
angegeben,bash
wird nicht als interaktive oder Anmeldeshell ausgeführt , sodass nicht dieselben Startskripte gelesen werden. Alles, was in ,, oder gesetzt/etc/profile
ist~/.bash_profile
,~/.bash_login
wird~/.profile
definitiv übersprungen.Wie in der
bash
Manpage erläutert :Wenn Sie also nicht glauben, dass Sie eine Verbindung über das Netzwerk herstellen, wird die
.bashrc
Datei möglicherweise auch nicht gelesen, wodurch alles übersprungen wird, was im vorherigen Schritt nicht übersprungen wurde.Lösung
Um dieses Problem zu umgehen, würde ich ein Skript erstellen, das das
PATH
auf etwas Passendes setzt, und dann den Befehl ausführen. Wenn Sie die vorhandenen.profile
oder andere Dateien verwenden möchten, können Sie sie einfach in Ihrem Skript als Quelle verwenden .quelle
In Ihrem ersten Beispiel:
Dadurch wird die
$PATH
Variable mit Ihrer Shell auf Ihrem Docker-Client außerhalb des Containers ausgewertet und anschließend der erweiterte Wert als Befehl zum Ausführen innerhalb des Containers übergeben. Sie können den oben genannten Wert mit der Ausführungecho $PATH
in der Befehlszeile außerhalb von Docker vergleichen und feststellen, dass sie identisch sind.In Ihrem zweiten Beispiel:
Dadurch wird die
$PATH
Variable im Container ausgewertet .Sie können Ihrem ersten Beispiel entkommen oder es in einfache Anführungszeichen setzen, um zu verhindern, dass die Bash-Shell auf Ihrer Workstation es erweitert, sodass es im Container ausgewertet wird. Beides würde funktionieren:
quelle
... bash -c "printenv PATH"
oder... bash -c "declare -p PATH"
die nur den Namen PATH (nicht seinen Wert) übergeben und das Programm oder die Shell im Container die Suche durchführen lassenProbieren Sie die
-l
Option fürbash
. Es wird in der Login-Shell ausgeführt und geladen/etc/profile
.quelle