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'