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

jwi*_*jwi 16 bash docker

我想在正在运行的docker容器中的文本文件中写入一行文本.这是我到目前为止所尝试的:

docker exec -d app_$i eval echo "server.url=$server_url" >> /home/app/.app/app.config
Run Code Online (Sandbox Code Playgroud)

响应:

/home/user/.app/app.config: No such file or directory
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

cfg_add="echo 'server.url=$server_url' >> /home/user/.app/app.config"
docker exec -i app_$i eval $cfg_add
Run Code Online (Sandbox Code Playgroud)

响应:

exec: "eval": executable file not found in $PATH
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

mkl*_*nt0 41

eval是一个外壳内置,而docker exec需要一个外部工具被调用,所以使用eval一种选择.

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

docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config"
Run Code Online (Sandbox Code Playgroud)

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


至于你的症状:

  • /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只能执行外部实用程序.


Ris*_*nha 11

另外:

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

(docker exec -i container sh -c "cat > c.sql") < c.sql
Run Code Online (Sandbox Code Playgroud)

这会将您输入到容器中.当然,这也适用于纯文本(无文件).取消-t参数非常重要.

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

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

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