我想在正在运行的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
有什么想法吗?
答案 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