2016-02-29 281 views
8

我想将一行文本写入正在运行的泊坞窗容器中的文本文件。这是我到目前为止已经试过: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 

任何想法?

+0

为什么'-d'为docker exec? – user2915097

+2

'eval'不在容器中。内核在主机和容器之间共享。程序不是。如果你在你的主机上安装了'nc',只要没有安装它,容器就不能执行它。 – Auzias

+0

@Auzias:问题不在于'eval'不是容器中的_present_(它很可能是容器shell的_shell内置函数),但它不是外部实用工具_因此'docker exec'不能调用它。 – mklement0

回答

22

eval是内建壳,而docker exec需要外部工具被调用,因此使用eval一个选项。

相反,调用在所述容器(bash明确壳的可执行文件,并把它传递给执行作为命令,通过其-c选项:

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

通过使用双 - 引用字符串传递到bash -c,您确保当前外壳首先执行字符串插值,而容器的bash实例然后看到扩展结果为文字,作为嵌入式单引号字符串的一部分。


至于你的症状

  • /home/user/.app/app.config: No such file or directory报道,因为你想要的重定向在主机的外壳实际发生的容器发生- 因为目录。 /home/user/.app显然你的主机的文件系统中不存在,命令失败从根本上,之前你的主机的shell甚至试图执行命令(bash将中止命令执行,如果无法执行输出重定向)。

    • 因此,即使你的第一个命令中还含有eval,它的使用并没有表面,直到你的第二个命令,这实际上得到执行的问题。
  • exec: "eval": executable file not found in $PATH发生的事情,因为,如前所述,eval不是外部工具,但shell内建docker exec只能执行外部工具。

+0

很棒的回答。我在下面发布了一个答案,没有意识到他想使用主机声明的变量等。你的答案要好得多,并且解释得很好。谢谢。 – CtheGood

+0

@CtheGood:谢谢;除了使用主机变量之外,您的命令将不起作用,因为您必须将参数_separately_传递给'docker exec';在您的情况下,_entire_单引号字符串将被解释为_command name_,并导致以下错误:'exec:“echo \”Hello World \“> test.txt”:可执行文件未在$ PATH中找到 – mklement0

+0

下面是一个示例,您可以在其中使用引号编写文件。例如,你想写'obj ['key'] ='value''到一个名为'/etc/config.py'的文件。 'docker exec“app_ $ i”bash -c'echo“obj ['' “'key''''] ='''value'''”>/etc/config.py'' – Gourneau

4

此外:

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

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

这将管子插入容器。当然,这也适用于纯文本(无文件)。离开-t参数非常重要。

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

UPDATE(如果你只需要复制文件,不能删除文件的部分):

泊坞v17.03具有docker cp其中本地FS和容器之间拷贝:https://docs.docker.com/engine/reference/commandline/cp/#usage