Versuchen, den Launcher als Reihe von Docker-Befehlen zu verstehen

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:

  1. Verzeichnis für die Trace-Ausgaben erstellen. Dies wird im ~-Pfad erstellt, um Berechtigungsprobleme zu vermeiden.
groot@galaxy:/var/discourse$ mkdir ~/traces
  1. 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 eigentlich 1> ist.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
  1. 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.