我在我的 GitLab CI 作业中运行以下命令:
ssh ${REMOTE_HOST} "docker restart $(docker ps --format '{{.Names}}' | grep '^backend')"
问题是它返回以下错误:
/usr/bin/bash: line 156: docker: command not found
"docker restart" requires at least 1 argument.
我知道它docker
确实存在并且可以在远程主机上运行,因为我可以登录到主机的 shell 并自己执行 docker 命令。
根据我的理解,错误似乎是双重的——它告诉我“找不到 docker 命令”,然后告诉我“docker restart 至少需要 1 个参数”。
因此,我假设docker
找不到嵌套命令的可执行文件,它返回“docker: command not found”错误,并且由于没有返回容器名称,因此也docker restart
失败了。
我也尝试在嵌套命令中替换docker
为/usr/bin/docker
,但无济于事。
我知道 ssh 隧道工作正常,因为就在该命令之前,我执行了以下两个命令,它们工作正常:
ssh ${REMOTE_HOST} "docker pull my_registry/backend:${VERSION} "
ssh ${REMOTE_HOST} "docker-compose -f docker-compose.yml up --detach --remove-orphans"
所以,我真的相信问题是docker
找不到内部命令的可执行文件。
双引号字符串仍将允许本地 bash shell 扩展变量、命令替换……在字符串内。
这意味着您的命令将
docker ps --format '{{.Names}}' | grep '^backend'
在本地机器上执行,而不是像您希望的那样在远程机器上执行。您可以尝试使用以下方法转义它:
或者使用单引号。这是一个例子:
更多详细信息,您可以在引用部分找到 bash (1)手册页。