尝试将启动器理解为一组 Docker 命令

我试图理解启动器(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

要将此内容捕获到文件中:

  1. 创建目录以存放跟踪记录。为避免权限问题,该目录创建在 ~ 路径下。
groot@galaxy:/var/discourse$ mkdir ~/traces
  1. 运行感兴趣的 bash 命令。关键在于跟踪输出不会发送到标准输出(stdout),而是发送到标准错误(stderr),因此请使用 2> 而不是 >(即 1>)。
groot@galaxy:/var/discourse$ sudo bash -x launcher start app 2> ~/traces/start_01
  1. 过滤文件,显示包含 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 被创建用于的常规任务,使用它是明智的。