使用docker exec执行两个命令

时间:2017-02-02 17:57:30

标签: linux docker command composer-php exec

我试图在docker exec中执行两个命令。具体来说,我必须在特定目录中运行命令。 我试过这个,但是没有工作:

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

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

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

但命令composer installdocker exec命令之后执行。 我该怎么办?

5 个答案:

答案 0 :(得分:22)

在您的第一个示例中,您将-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。然后,直到已经在容器内部,它们才会被shell解释。

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'

答案 1 :(得分:2)

容器id之后的所有内容都是要运行的命令,因此在第一个示例中-c不是exec的选项,但命令docker会尝试运行并失败,因为该命令不存在。< / p>

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

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

答案 2 :(得分:1)

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

docker exec [id] /bin/bash -c 'cd /var/www/project && composer install'
非常感谢!

答案 3 :(得分:0)

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

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

所以在你的例子中:

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

答案 4 :(得分:0)

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

我需要通过ssh针对docker容器执行一个复合docker exec命令。 我设法通过两个步骤实现了这一目标:

-定义包含作为环境变量过期的命令的变量

-ssh命令运行

  1. 环境变量的定义:

    export COMMAND =“ bash -c'php bin / console --version && composer --version'”

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

ssh -t -o StrictHostKeyChecking =否-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

如您所见,我将命令保留在单引号中,以将其实际值传递给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