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

Sol*_*olx 62 docker

我需要使用docker exec运行2个命令.我正在从docker容器中复制一个文件,并且不想处理使用ssh之类的凭据.此命令复制文件:

sudo docker exec boring_hawking tar -cv /var/log/file.log | tar -x
Run Code Online (Sandbox Code Playgroud)

但是它创建了一个子目录var/log,我想避免这样做,所以如果我能在docker容器中做这些,我应该是好的:

cd /var/log ; tar -cv ./file.log
Run Code Online (Sandbox Code Playgroud)

如何让docker exec运行2个命令?

Sol*_*olx 104

这导致了答案: Docker命令行中的Escape字符 我最终做到了这样:

sudo docker exec boring_hawking bash -c 'cd /var/log ; tar -cv ./file.log' | tar -x
Run Code Online (Sandbox Code Playgroud)

因此,它运行一个bash命令,其参数是我想要运行的2个命令.


zbr*_*son 21

对于偶然发现此问题并希望以不同方式指定多个命令以执行更复杂脚本的其他任何人:

cat <<EOF | docker exec --interactive boring_hawking sh
cd /var/log
tar -cv ./file.log
EOF
Run Code Online (Sandbox Code Playgroud)

  • 我使用此方法收到“输入设备不是 TTY”错误 (3认同)
  • 注意:如果您的脚本包含变量,则需要转义“$”。例如:`for i in {1..5}; 执行 echo "欢迎 \$i 次"; 完成`(在回显中使用`\$i`!) (2认同)

P-G*_*-Gn 19

通常,需要几个命令就是改变工作目录 - 就像OP的问题一样.

为此,docker现在可以-w选择指定工作目录.例如,在本案中

docker exec -w /var/log boring_hawking tar -cv ./file.log
Run Code Online (Sandbox Code Playgroud)


小智 6

如果有其他人来这里寻求很棒的答案,但还希望有一种更好的方法来解决OP的原始问题(OP的OP ..?),将文件从Docker容器中复制出来,现在有一个docker cp命令可以执行此操作:https: //docs.docker.com/engine/reference/commandline/cp/