Ich versuche, die vom Launcher ausgegebenen Docker-Befehle zu verstehen.
Dafür muss ich auch die anderen Bash-Befehle im Skript nachvollziehen. Da ich kein Bash-Experte bin, muss ich mich für einige Teile erst recherchieren. Normalerweise lese ich den Code, leite den Befehl manuell ab und teste ihn dann, um sicherzugehen, z. B.:
docker info 2> /dev/null
Manchmal sind einige Zeilen komplexer, und ich führe eine äquivalente Variante aus, z. B.:
test=$(($(stat -f --format="%a*%S" /var/lib/docker)/1024**3 < 5)); echo $test
Die aktuelle Unterfunktion, an der ich arbeite, ist host_run(), und ich habe keine Ahnung, woher die Eingabe für diese Routine kommt.
https://github.com/discourse/discourse_docker/blob/master/launcher#L259-#L287.
Ich könnte in den nächsten Tagen viele Fragen stellen oder echo-Anweisungen in eine modifizierte Version von launcher einfügen, aber es muss doch etwas Besseres geben.
Gibt es eine Möglichkeit wie den Befehl script, der die internen Docker-Befehle erfasst und in einer Datei protokolliert?
EDIT
Das scheint zu funktionieren. Siehe: Debugging Bash-Skripte
Einfach die Bash-Option -x verwenden, z. B.:
groot@galaxy:/var/discourse$ sudo bash -x launcher start app
Um dies in eine Datei zu speichern:
- Verzeichnis für die Trace-Ausgaben erstellen. Dies wird im
~-Pfad erstellt, um Berechtigungsprobleme zu vermeiden.
groot@galaxy:/var/discourse$ mkdir ~/traces
- Den gewünschten Bash-Befehl ausführen. Der Trick besteht darin, dass die Trace-Ausgabe nicht auf stdout, sondern auf stderr erfolgt. Verwenden Sie daher
2>statt>, was eigentlich1>ist.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
- Die Datei filtern und nur Zeilen mit dem Docker-Befehl anzeigen.
groot@galaxy:/var/discourse$ grep /usr/bin/docker ~/traces/start_01
Beispielausgabe:
+ docker_path=/usr/bin/docker
+ '[' -z /usr/bin/docker ']'
++ /usr/bin/docker info
+ /usr/bin/docker info
++ /usr/bin/docker --version
++ /usr/bin/docker images
++ /usr/bin/docker run -i --rm -a stdout -a stderr discourse/base:2.0.20200512-1735 echo working
++ /usr/bin/docker info --format '{{.DockerRootDir}}'
+ '[' -z /usr/bin/docker ']'
++ /usr/bin/docker --version
++ /usr/bin/docker ps
++ /usr/bin/docker ps -a
+ /usr/bin/docker start app
Das sieht vielleicht nach vielen mehr Docker-Befehlen aus als erwartet, aber launcher führt viele Integritätsprüfungen durch, die man sonst manuell durchführen müsste. Das überzeugt mich, launcher für die regulären Aufgaben zu verwenden, für die er entwickelt wurde.