【问题标题】:Docker exec - Write text to file in containerDocker exec - 将文本写入容器中的文件
【发布时间】:2016-06-12 17:08:45
【问题描述】:

我想将一行文本写入一个正在运行的 docker 容器内的文本文件。到目前为止,这是我尝试过的:

docker exec -d app_$i eval echo "server.url=$server_url" >> /home/app/.app/app.config

回复:

/home/user/.app/app.config: No such file or directory

第二次尝试:

cfg_add="echo 'server.url=$server_url' >> /home/user/.app/app.config"
docker exec -i app_$i eval $cfg_add

回复:

exec: "eval": executable file not found in $PATH

有什么想法吗?

【问题讨论】:

  • 为什么 -d 用于 docker exec?
  • eval 不在容器中。内核在主机和容器之间共享。程序不是。如果你在你的主机上安装了nc,容器将无法执行它,只要它没有安装它。
  • @Auzias:问题不在于eval 不在容器中存在(它可能是,作为shell builtin容器的外壳),但它不是外部实用程序,因此docker exec 无法调用它。

标签: bash docker


【解决方案1】:

eval 是一个外壳内置,而docker exec 需要调用一个外部实用程序,因此使用eval 不是 > 一个选项。

相反,在容器中调用一个 shell 可执行文件 (bash)显式,并通过它的-c 选项将命令作为 字符串 传递给它执行:

docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config"

通过使用 双引号 字符串传递给 bash -c,您可以确保 current shell 首先执行字符串插值,然后容器的 bash 实例将扩展结果视为 literal,作为嵌入 single-quoted 字符串的一部分。


至于你的症状

  • /home/user/.app/app.config: No such file or directory 被报告,因为您打算在容器中发生的重定向 实际上发生在 您的主机的 shell - 并且因为 dir. /home/user/.app 显然不存在于您主机的文件系统中,该命令根本上失败,之前您主机的 shell 甚至尝试执行该命令(bash 将中止命令执行如果无法执行输出重定向)。

    • 因此,即使您的第一个命令也包含 eval,但在您的第二个命令实际上确实被执行之前,它的使用并没有成为问题。
  • exec: "eval": executable file not found in $PATH 发生了,因为如前所述,eval 不是 外部实用程序,而是 shell 内置,而 docker exec 只能执行外部实用程序。

【讨论】:

  • 这里是一个示例,您可以在其中编写带引号的文件。例如你想将obj['key'] = 'value'写入一个名为/etc/config.pydocker exec "app_$i" bash -c 'echo "obj['"'key'"'] = '"'value '"'"> /etc/config.py'的文件
  • @Gourneau: "echo \"obj['key'] = 'value'\"> /etc/config.py" 更简单。
【解决方案2】:

另外:

如果您需要从容器外部写入文本,这也可以:

(docker exec -i container sh -c "cat > c.sql") < c.sql

这会将您的输入输入到容器中。当然,这也适用于纯文本(无文件)。忽略-t 参数很重要。

https://github.com/docker/docker/pull/9537

更新(如果您只需要复制文件,而不是文件的一部分):

Docker v17.03 有 docker cp 在本地 fs 和容器之间复制:https://docs.docker.com/engine/reference/commandline/cp/#usage

【讨论】:

    【解决方案3】:

    尝试使用heredoc:

    (docker exec -i container sh -c "cat > /test/iplist") << EOF
    10.99.154.146
    10.99.189.247
    10.99.189.250
    EOF
    

    【讨论】:

      猜你喜欢
      • 2020-06-05
      • 2018-08-17
      • 2019-05-25
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多