ランチャーが発行する Docker コマンドを理解しようとしています。
これには、スクリプト内の他の 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.
今後数日間にわたり多くの質問を投げかけたり、修正版の launcher に echo 文を散りばめたりすることもできますが、もっと良い方法があるはずです。
script のようなコマンドで、実行されている内部の Docker コマンドをキャプチャし、ログファイルに記録する方法はないでしょうか?
編集
これは機能するようです。参照:Bash スクリプトのデバッグ
単純に bash の -x オプションを使用します。例えば:
groot@galaxy:/var/discourse$ sudo bash -x launcher start app
これをファイルに記録するには
- トレースを格納するディレクトリを作成します。権限の問題を避けるため、
~パス下に作成します。
groot@galaxy:/var/discourse$ mkdir ~/traces
- 対象の bash コマンドを実行します。ポイントは、トレース出力が標準出力 (stdout) ではなく標準エラー出力 (stderr) へ出力されるため、
>ではなく2>を使用する点です(2>は実際には1>ではなく stderr へのリダイレクトです)。
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 が作成された本来の用途の通常のタスクには launcher を使用することが確信できました。