Я пытаюсь понять команды Docker, которые запускает launcher.
Это также требует понимания других команд bash в скрипте. Поскольку я не эксперт по bash, мне приходится проводить исследования, чтобы разобраться в некоторых частях. Обычно я читаю код, вручную определяю команду, а затем запускаю её для проверки, например:
docker info 2> /dev/null
Иногда некоторые строки более сложные, и я запускаю их эквивалент, например:
test=$(($(stat -f --format="%a*%S" /var/lib/docker)/1024**3 < 5)); echo $test
Сейчас я работаю над подпрограммой host_run(), и у меня нет представления, откуда берётся входной параметр для этой процедуры.
https://github.com/discourse/discourse_docker/blob/master/launcher#L259-#L287.
Теперь я мог бы задавать множество вопросов в ближайшие дни или добавлять команды echo в модифицированный launcher, но surely должно быть что-то лучшее.
Существует ли средство, подобное команде script, которое позволит захватывать внутренние команды Docker, выполняемые в процессе, и записывать их в файл?
РЕДАКТИРОВАНИЕ
Кажется, это работает. См.: Отладка скриптов Bash
Просто используйте опцию -x для bash, например:
groot@galaxy:/var/discourse$ sudo bash -x launcher start app
Чтобы сохранить это в файл:
- Создайте каталог для хранения трассировок. Он будет создан в пути
~, чтобы избежать проблем с правами доступа.
groot@galaxy:/var/discourse$ mkdir ~/traces
- Запустите интересующую команду bash. Хитрость заключается в том, что вывод трассировки идёт не в stdout, а в stderr, поэтому используйте
2>вместо>, который фактически является1>.
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
- Отфильтруйте файл, показав строки с командой docker.
groot@galaxy:/var/discourse$ grep /usr/bin/docker ~/traces/start_01
Пример вывода:
+ 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
Это может показаться гораздо большим количеством команд Docker, чем ожидалось, но launcher выполняет множество проверок целостности, которые вам пришлось бы делать вручную. Это убеждает меня использовать launcher для регулярных задач, для которых он был создан.