Bash Docker exec-将文本写入容器中的文件
我想在运行的docker容器中向文本文件写入一行文本。以下是我迄今为止所尝试的:Bash Docker exec-将文本写入容器中的文件,bash,docker,Bash,Docker,我想在运行的docker容器中向文本文件写入一行文本。以下是我迄今为止所尝试的: 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 exec: "eval": executable file not found in $PATH 第二次尝试:
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
exec: "eval": executable file not found in $PATH
第二次尝试:
cfg_add="echo 'server.url=$server_url' >> /home/user/.app/app.config"
docker exec -i app_$i eval $cfg_add
答复:
/home/user/.app/app.config: No such file or directory
exec: "eval": executable file not found in $PATH
有什么想法吗?
eval
是一个内置的shell,而docker exec
需要调用一个外部实用程序,因此使用eval
不是一个选项
相反,显式调用容器中的shell可执行文件(bash
),并通过其-c
选项将要执行的命令作为字符串传递给它:
docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config"
通过使用双引号字符串传递给bash-c
,可以确保当前shell首先执行字符串插值,而容器的bash
实例则将扩展结果视为文本,作为嵌入的单引号字符串的一部分
至于你的症状:
,因为您打算在容器中发生的重定向实际上发生在主机的外壳中,并且因为dir/home/user/.app/app.config:未报告此类文件或目录
显然不存在于主机的文件系统中,该命令根本失败,主机的shell甚至还没有尝试执行该命令(/home/user/.app
如果无法执行输出重定向,将中止命令执行)bash
- 因此,即使您的第一个命令也包含
,但直到您的第二个命令实际执行后,它的使用才成为一个问题eval
- 因此,即使您的第一个命令也包含
exec:“eval”:未在$PATH中找到可执行文件,因为如上所述,
不是外部实用程序,而是shell内置工具,eval
只能执行外部实用程序docker exec
(docker exec -i container sh -c "cat > c.sql") < c.sql
(docker exec-i容器sh-c“cat>c.sql”)
这将通过管道将输入导入容器。当然,这也适用于纯文本(无文件)。请务必关闭-t
参数
看
更新(如果您只需要复制文件,而不是部分文件):
Docker v17.03具有Docker cp
,可在本地fs和容器之间进行复制:尝试使用heredoc:
(docker exec -i container sh -c "cat > /test/iplist") << EOF
10.99.154.146
10.99.189.247
10.99.189.250
EOF
(docker exec-i容器sh-c“cat>/test/iplist”)为什么容器中不存在docker exec的-d
。内核在主机和容器之间共享。这些程序不是。如果您在主机上安装了nc
,则容器将无法执行它,只要它没有安装在其中。@Auzias:问题不是容器中没有eval
(它可能是容器外壳的外壳内置),而是它不是一个外部实用程序,因此,docker exec
无法调用它。下面是一个示例,您可以编写带引号的文件。例如,您想将obj['key']='value'
写入名为/etc/config.py
docker exec“app_$i”bash-c'echo“obj[''key']=''value''>/etc/config.py'
@Gourneau:“echo\'obj['key']='value'>/etc/config.py'
更简单。