我正在尝试在docker exec中执行两个命令。具体来说,我必须在特定目录中运行命令。我试过了,但是没用:
docker exec [id] -c 'cd /var/www/project && composer install'
未检测到参数-c
。我也尝试过:
docker exec [id] cd /var/www/project && composer install
但是命令composer install
在docker exec
命令之后执行。我该怎么办?
在第一个示例中,您将-c
标志赋予docker exec
。这是一个简单的答案:docker exec
没有-c
标志。
在您的第二个示例中,您的shell在Docker甚至没有看到它之前就将其解析为两个命令。等效于此:
if docker exec [id] cd /var/www/project
then
composer install
fi
首先,运行docker exec
,如果退出0(成功),则composer install
将尝试在Docker外部运行locally。
您需要做的是使用字符串将两个命令作为单个参数传递给docker exec
。然后它们将不会被外壳解释,直到已经在容器中为止。
docker exec [id] "cd /var/www/project && composer install"
但是,正如您在评论中指出的那样,这也不起作用。这是因为cd
是内置的shell,并不单独存在。尝试将其作为初始命令执行将失败。因此,下一步是将其交给shell执行。
docker exec [id] "bash -c 'cd /var/www/project && composer install'"
最后,在这一点上&&
已移到内部引号中,因此我们实际上并不需要bash
命令周围的引号...如果愿意,可以将其删除。
docker exec [id] bash -c 'cd /var/www/project && composer install'
容器ID后面的所有内容都是要运行的命令,因此在第一个示例中-c
不是exec的选项,但是命令docker尝试运行并失败,因为该命令不存在。
[您很可能从入口点设置为docker run
的/bin/sh
命令中找到了此语法。但是,exec绕过了入口点,因此您需要包括完整的命令才能运行。正如其他人指出的那样,该命令包括一个外壳,如bash或在以下示例中为sh:
docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'
如果要运行2个任意命令,其他答案也很好。但是,如果第一个命令只是cd
,则应该使用-w
选项设置工作目录。
docker exec -w {dir} {container} {commands}
因此在您的示例中:
docker exec -w /var/www/project {container} composer install
正如Nehal J Wani在他的评论中所说,正确的语法如下:
docker exec [id] /bin/bash -c 'cd /var/www/project && composer install'
非常感谢!
我想在这里添加我的示例,因为它比上面显示的示例要复杂一些。
我需要通过ssh针对docker容器执行一个复合docker exec命令。我设法通过两个步骤实现了这一目标:-定义包含作为环境变量而有效的命令的变量的定义-ssh命令运行它
环境变量定义:
export COMMAND =“ bash -c'php bin / console --version && composer --version'”
在远程系统上运行的ssh命令:
ssh -t -o StrictHostKeyChecking =否-o UserKnownHostsFile = / dev / null -i keyfile.pem [email protected]'docker exec docker ps|grep php|grep api|grep -v cron|awk '"'"'{print $1}'"'"'
'$ COMMAND
如您所见,我将命令放在单引号之外,将其实际值传递给SSH进程
命令执行的输出是:
Warning: Permanently added '111.222.111.222' (ECDSA) to the list of known hosts.
Cannot load Xdebug - it was already loaded
Symfony 4.3.5 (env: dev, debug: true)
Cannot load Xdebug - it was already loaded
Composer version 1.9.1 2019-11-01 17:20:17
Connection to 111.222.111.222 closed.
如果希望单行执行此命令,则可以使用我的第一个示例的修改后的版本:
COMMAND="bash -c 'php bin/console --version && composer --version'" ssh -t -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i keyfile.pem [email protected] 'docker exec `docker ps|grep php|grep api|grep -v cron|awk '"'"'{print $1}'"'"'` '$COMMAND