Sto cercando di capire i comandi Docker emessi dal launcher.
Questo richiede anche di comprendere gli altri comandi bash presenti nello script. Poiché non sono un esperto di bash, devo fare alcune ricerche per capire alcune parti. Normalmente leggo il codice, ricavo manualmente il comando e poi lo eseguo in prova per verificare, ad esempio:
docker info 2> /dev/null
A volte alcune righe sono più complesse e eseguo un comando equivalente, ad esempio:
test=$(($(stat -f --format="%a*%S" /var/lib/docker)/1024**3 < 5)); echo $test
La subroutine su cui sto lavorando al momento è host_run(), per la quale non ho idea da dove provenga l’input della routine.
https://github.com/discourse/discourse_docker/blob/master/launcher#L259-#L287.
Potrei fare molte domande nei prossimi giorni o inserire istruzioni echo in una versione modificata di launcher, ma deve esserci un modo migliore.
Esiste uno strumento simile al comando script che catturi i comandi Docker interni eseguiti e li registri in un file?
MODIFICA
Sembra che questo funzioni. Vedi: Debugging Bash scripts
Basta utilizzare l’opzione -x di bash, ad esempio:
groot@galaxy:/var/discourse$ sudo bash -x launcher start app
Per salvare l’output in un file:
- Crea una directory per contenere le tracce. Questa viene creata sotto il percorso
~per evitare problemi di permessi.
groot@galaxy:/var/discourse$ mkdir ~/traces
- Esegui il comando bash di interesse. Il trucco è che l’output della traccia non va su stdout, ma su stderr, quindi usa
2>invece di>che corrisponde in realtà a1>.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
- Filtra il file mostrando le righe contenenti il comando docker.
groot@galaxy:/var/discourse$ grep /usr/bin/docker ~/traces/start_01
Esempio di output:
+ 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
Potrebbe sembrare che ci siano molti più comandi Docker del previsto, ma launcher esegue numerosi controlli di integrità che dovresti altrimenti fare manualmente. Questo mi convince a utilizzare launcher per le attività ordinarie per cui è stato creato.