使用docker exec执行两个命令

Bra*_*min 15 linux command exec composer-php docker

我正在尝试在docker exec中执行两个命令.具体来说,我必须在特定目录中运行命令.我试过这个,但是没有用:

docker exec [id] -c 'cd /var/www/project && composer install'
Run Code Online (Sandbox Code Playgroud)

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

docker exec [id] cd /var/www/project && composer install
Run Code Online (Sandbox Code Playgroud)

但该命令composer installdocker exec命令后执行.我该怎么做?

Dan*_*owe 24

在你的第一个例子中,你给的是-c旗帜docker exec.这是一个简单的答案:docker exec没有-c旗帜.

在你的第二个例子中,你的shell在Docker看到之前将其解析为两个命令.它相当于:

if docker exec [id] cd /var/www/project
then
    composer install
fi
Run Code Online (Sandbox Code Playgroud)

首先,docker exec运行,如果它退出0(成功),composer install将尝试在Docker之外本地运行.

您需要做的是将两个命令作为单个参数传递给docker exec使用字符串.然后,直到已经在容器内部,它们才会被shell解释.

docker exec [id] "cd /var/www/project && composer install"
Run Code Online (Sandbox Code Playgroud)

但是,正如您在评论中指出的那样,这也行不通.那是因为它cd是一个内置的shell,并不是自己存在的.尝试执行它作为初始命令将失败.所以下一步就是把它交给shell来执行.

docker exec [id] "bash -c 'cd /var/www/project && composer install'"
Run Code Online (Sandbox Code Playgroud)

最后,此时&&已经进入了一组内部引号,因此我们并不需要bash命令周围的引号......如果您愿意,可以删除它们.

docker exec [id] bash -c 'cd /var/www/project && composer install'
Run Code Online (Sandbox Code Playgroud)