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:
- Crie um diretório para armazenar os rastreamentos. Ele é criado no caminho
~para evitar problemas de permissão.
groot@galaxy:/var/discourse$ mkdir ~/traces
- 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 a1>.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
- 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.