我试图理解启动器(launcher)发出的 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>而不是>(即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 被创建用于的常规任务,使用它是明智的。