如何使用docker exec运行两个命令

137

我需要使用docker exec运行两个命令。我正在将文件从docker容器中复制出来,并且不想使用类似ssh的方法处理凭据。这个命令可以复制一个文件:

sudo docker exec boring_hawking tar -cv /var/log/file.log | tar -x

但它会创建一个名为 var/log 的子目录,我希望避免这种情况,因此如果我可以在 Docker 容器中执行这些操作,就应该没问题:

cd /var/log ; tar -cv ./file.log

如何在 docker exec 中运行两个命令?

4个回答

199

这导致了答案: Docker命令行中的转义字符 我最终做了这个:

sudo docker exec boring_hawking bash -c 'cd /var/log ; tar -cv ./file.log' | tar -x

它的工作原理是通过运行一个bash命令,参数是我想要运行的两个命令。


1
如果您在命令中使用了双引号,那么可以这样做:-c "cd /var/log; tar -cv \"$1\"",其中文件位于参数1。 - zed

50

对于任何想要以不同方式指定多个命令以执行更复杂脚本的其他人:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF

1
这是一个非常好的可读解决方案,当您想要执行更复杂的脚本时使用。它值得更多的赞扬 ;) - Slava Fomin II
3
我使用这种方法时出现了“输入设备不是TTY”的错误。 - Roy Shilkrot
“--interactive” 本来应该解决这个问题,如果不行的话,没有更广泛的上下文信息的情况下我也不确定发生了什么问题。 - zbrunson
1
@Roy 试一下加上 -t 参数? - ntg
2
注意:如果您的脚本包含变量,则需要转义 $。例如:for i in {1..5}; do echo "欢迎 \$i 次"; done(在 echo 中使用 \$i!) - Philipp
注意不要指定-t标志,只需使用-i--interactive即可,否则会出现“输入设备不是TTY”的错误。 - joliver

45

很多时候,需要使用多个命令来改变工作目录 - 就像在OP的问题中。

为此,docker现在有一个-w选项来指定工作目录。例如,在当前情况下:

docker exec -w /var/log boring_hawking tar -cv ./file.log

6
如果有其他人来到这里寻找精彩答案,但是也想要一种更好的方法来解决原问题(楼主的原问题..?)——从Docker容器中复制文件,现在有一个docker cp命令可以实现这个目标:https://docs.docker.com/engine/reference/commandline/cp/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接