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

我想将一行文本写入正在运行的泊坞窗容器中的文本文件。 以下是我迄今为止所尝试的:

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 

有任何想法吗?

eval是shell 内build的 ,而docker exec需要调用外部工具 ,所以使用eval 不是一个选项。

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

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

通过使用双引号string传递给bash -c ,可以确保当前 shell首先执行string插值,而容器的bash实例将扩展结果视为文字 ,作为embedded的单引号string的一部分。


至于你的症状

  • /home/user/.app/app.config: No such file or directory ,因为您打算在容器中发生的redirect实际发生在您的主机的shell中 – 并且因为dir。 /home/user/.app显然不存在于你的主机的文件系统中, 你的主机的shell甚至试图执行这个命令之前 ,这个命令从根本上失败了(如果输出redirect不能执行, bash将中止命令的执行)。

    • 因此,即使你的第一个命令也包含了eval ,它的使用并不会成为一个问题,直到你的第二个命令被执行。
  • exec: "eval": executable file not found in $PATH ,因为如前所述, eval不是外部工具 ,而是一个内置的shell ,而docker exec只能执行外部工具。

另外:

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

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

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

请参阅https://github.com/docker/docker/pull/9537

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

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

尝试单引号整个事情:

 docker exec -i app_$i 'echo "Hello World" > test.txt'