【问题标题】:How to use ">>" operator in Docker?如何在 Docker 中使用“>>”运算符?
【发布时间】:2024-01-22 12:58:01
【问题描述】:

我正在尝试使用docker exec 将字符串附加到 docker 容器中的文件。但是,它似乎没有正确解释“>>”运算符

 sudo docker exec --interactive mycontainer cat /etc/postfix/main.cf

返回

smtpd_banner = $myhostname ESMTP $mail_name (Debian)
biff = no
append_dot_mydomain = no
readme_directory = no

# Basic configuration
# myhostname =
...

但是

sudo docker exec --interactive mycontainer echo "my new line" >> /etc/postfix/main.cf

返回-bash: /etc/postfix/main.cf: No such file or directory

无论哪种方式,都有一个技巧可以将“>>”运算符传递给 docker-exec,或者有另一个命令可以将字符串附加到文件中(这也可以,但我找不到那个是原生的,因为容器没有任何花哨的库)。

有人有窍门吗?

【问题讨论】:

  • 糟糕,抱歉,会解决这个问题
  • 你需要在 docker 中运行一个 shell 来解释操作符。 echo 不是外壳。改为运行bash 之类的东西,然后在其中执行echo
  • @ArthurAttout 你需要为命令提供 bash 类型和 -c 选项,试试这个应该可以工作sudo docker exec -i -t mycontainer /bin/bash -c 'echo my new line>>/etc/postfix/main.cf'

标签: docker append operators docker-exec


【解决方案1】:

您在 shell 中运行 sudo 命令,它在 >> 到达 sudo 或 docker 客户端之前对其进行解释。你需要对字符进行转义或引用,这样你自己的 shell 就不会解释它们,然后你需要在 docker 容器内运行一个 shell 来解释它们:

sudo docker exec -i mycontainer \
  /bin/sh -c 'echo "my new line" >> /etc/postfix/main.cf'

要将变量从外壳传递到容器内部,您将无法使用单引号。您可以使用双引号并转义您想要传递给内壳的任何内容。

sudo docker exec -i mycontainer \
  /bin/sh -c "echo \"$host_var \$container_var\" >> /etc/postfix/main.cf"

【讨论】:

  • 感谢您的提示,它成功了!为什么我需要 /bin/sh ?只是为了解释“>>”吗?
  • /bin/sh 是在容器内运行的 shell。你需要它来解释像 i/o 重定向这样的 shell 命令。
  • 抱歉挖掘了我的老问题,但我面临着另一个问题。如何在“我的新行”中放置一个变量?据我了解,如果我尝试“我的新 var $var”,$var 将由容器内的 shell 评估,它不知道 $var。我能做些什么 ?我尝试在指令之前创建字符串,并将其弹出到 docker exec 中,但它仍然由远程 shell 评估
  • 我已经更新了答案,提供了有关在引号内引用和转义值以实现您的目标的更多详细信息。
  • @ArthurAttout 双引号的替代方法是仍然使用单引号,除了在变量周围切换为双引号。我发现这更容易阅读,因为您不需要转义任何内容:/bin/sh -c 'echo '"$host_var"' $container_var >> /etc/postfix/main.cf'