Tentando entender o launcher como uma série de comandos Docker

Estou tentando entender os comandos Docker emitidos pelo launcher.

Isso também exige entender os outros comandos bash no script. Como não sou um especialista em bash, preciso fazer algumas pesquisas para entender certas partes. Normalmente, leio o código, deduzo manualmente o comando e depois executo um teste para confirmar, por exemplo:

docker info 2> /dev/null

Às vezes, algumas linhas são mais complicadas e eu executo uma versão equivalente, como:

test=$(($(stat -f --format="%a*%S" /var/lib/docker)/1024**3 < 5)); echo $test

A sub-rotina atual em que estou trabalhando é host_run(), e não tenho ideia de onde vem a entrada para essa rotina.

https://github.com/discourse/discourse_docker/blob/master/launcher#L259-#L287.

Agora, eu poderia fazer muitas perguntas nos próximos dias ou adicionar instruções echo em uma versão modificada do launcher, mas deve haver algo melhor.

Existe alguma ferramenta, como o comando script, que capture os comandos Docker internos sendo executados e os registre em um arquivo?

EDIT

Parece que isso funciona. Veja: Depurando scripts Bash

Basta usar a opção -x do bash, por exemplo:

groot@galaxy:/var/discourse$ sudo bash -x launcher start app

Para capturar isso em um arquivo:

  1. Crie um diretório para armazenar os rastreamentos. Ele é criado no caminho ~ para evitar problemas de permissão.
groot@galaxy:/var/discourse$ mkdir ~/traces
  1. Execute o comando bash de interesse. O truque é que a saída do rastreamento vai para stderr, não para stdout, então use 2> em vez de >, que equivale a 1>.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
  1. Filtre o arquivo mostrando as linhas com o comando docker.
groot@galaxy:/var/discourse$ grep /usr/bin/docker ~/traces/start_01

Exemplo de saída:

+ 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

Isso pode parecer com muitos mais comandos Docker do que o esperado, mas o launcher realiza muitas verificações de integridade que você teria que fazer manualmente. Isso me convence a usar o launcher para as tarefas regulares para as quais ele foi criado.