使用docker exec执行两个命令



我正在尝试在docker-exec中执行两个命令。具体来说,我必须在一个特定的目录中运行一个命令。我试过了,但没用:

docker exec [id] -c 'cd /var/www/project && composer install'

未检测到参数-c。我也试过这个:

docker exec [id] cd /var/www/project && composer install

但是命令CCD_ 2是在CCD_ 3命令之后执行的。我该怎么做?

在第一个示例中,您将-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之外的本地运行

您需要做的是使用字符串将这两个命令作为单个参数传递给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不是执行的选项,但命令docker试图运行,但由于该命令不存在而失败。

很可能您在docker run命令中发现了这种语法,其中入口点设置为/bin/sh。但是,exec会绕过入口点,因此需要包含完整的命令才能运行。正如其他人所指出的,该命令包括一个类似shell的bash,或者在下面的示例中,sh:

docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'

正如Nehal J Wani在评论中所说,正确的语法如下:

docker exec [id] /bin/bash -c 'cd /var/www/project && composer install'

非常感谢!

如果您想运行两个任意命令,其他答案也可以。但是,如果第一个命令只是cd,那么您应该使用-w选项来设置工作目录。

docker exec -w {dir} {container} {commands}

所以在你的例子中:

docker exec -w /var/www/project {container} composer install

我想在这里添加我的示例,因为它比上面显示的要复杂一些。此示例还说明了如何查找应该在docker exec命令中使用的容器id。

我需要通过ssh对docker容器执行一个复合docker-exec命令。我通过两个步骤做到了这一点:

-包含作为环境变量导出的命令的变量的定义

-运行它的ssh命令

  1. 环境变量定义:

    export COMMAND="bash-c'php bin/console--version&&composer--version'">

  2. 在远程系统上运行的ssh命令:

ssh-t-o StrictHostKeyChecking=no-o UserKnownHostsFile=/dev/null-i密钥文件.pemec2-user@111.222.111.222'docker execdocker 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 ec2-user@111.222.111.222 'docker exec `docker ps|grep php|grep api|grep -v cron|awk '"'"'{print $1}'"'"'` '$COMMAND

相关内容

  • 没有找到相关文章

最新更新