我想在正在运行的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
归档时间: |
|
查看次数: |
25378 次 |
最近记录: |