Docker exec - 将文本写入容器中的文件

时间:2016-02-29 15:29:10

标签: bash docker

我想在正在运行的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

有什么想法吗?

3 个答案:

答案 0 :(得分:37)

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

相反,在容器中调用shell可执行文件(bash ,并通过其{{}将命令传递给 string 。 1}}选项:

-c

通过使用双引号字符串传递给docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config" ,您可以确保当前 shell首先执行字符串插值,而容器&#39;然后,bash -c实例将扩展结果视为文字,作为嵌入式单引号字符串的一部分。

至于你的症状

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

    • 因此,即使您的第一个命令也包含bash,它的使用也不会出现问题,直到您的第二个命令实际 执行
  • eval发生了,因为如上所述,exec: "eval": executable file not found in $PATH不是外部实用程序,而是 shell内置,{ {1}}只能执行外部实用程序。

答案 1 :(得分:9)

此外:

如果您需要从容器外部写文本,这也有效:

(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

答案 2 :(得分:1)

尝试使用heredoc:

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