Estoy tratando de entender los comandos de Docker que ejecuta el launcher.
Esto también requiere comprender los demás comandos de bash en el script. Como no soy un experto en bash, tengo que investigar para entender algunas partes. Normalmente leo el código, deduzco manualmente el comando y luego lo ejecuto para verificar, por ejemplo:
docker info 2> /dev/null
A veces algunas líneas son más complicadas y ejecuto una versión equivalente, por ejemplo:
test=$(($(stat -f --format="%a*%S" /var/lib/docker)/1024**3 < 5)); echo $test
La subrutina en la que estoy trabajando actualmente es host_run(), y no tengo idea de dónde proviene la entrada para esta rutina.
https://github.com/discourse/discourse_docker/blob/master/launcher#L259-#L287.
Podría hacer muchas preguntas durante los próximos días o agregar declaraciones echo en un launcher modificado, pero debe haber algo mejor.
¿Existe alguna herramienta, como el comando script, que capture los comandos internos de Docker que se ejecutan y los registre en un archivo?
EDITAR
Esto parece funcionar. Véase: Depuración de scripts Bash
Simplemente usa la opción -x de bash, por ejemplo:
groot@galaxy:/var/discourse$ sudo bash -x launcher start app
Para guardar esto en un archivo:
- Crea un directorio para almacenar las trazas. Esto se crea en la ruta
~para evitar problemas de permisos.
groot@galaxy:/var/discourse$ mkdir ~/traces
- Ejecuta el comando bash de interés. El truco es que la salida de la traza no va a stdout, sino a stderr, así que usa
2>en lugar de>, que en realidad es1>.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
- Filtra el archivo mostrando las líneas que contienen el comando docker.
groot@galaxy:/var/discourse$ grep /usr/bin/docker ~/traces/start_01
Ejemplo de salida:
+ 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
Eso puede parecer mucho más comandos de Docker de lo esperado, pero launcher realiza muchas comprobaciones de integridad que tendrías que hacer manualmente. Esto me convence de usar launcher para las tareas regulares para las que fue creado.