Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Docker exec-将文本写入容器中的文件_Bash_Docker - Fatal编程技术网

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

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容器中向文本文件写入一行文本。以下是我迄今为止所尝试的:

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
实例则将扩展结果视为文本,作为嵌入的单引号字符串的一部分


至于你的症状:

  • /home/user/.app/app.config:未报告此类文件或目录
    ,因为您打算在容器中发生的重定向实际上发生在主机的外壳中,并且因为dir
    /home/user/.app
    显然不存在于主机的文件系统中,该命令根本失败,主机的shell甚至还没有尝试执行该命令(
    bash
    如果无法执行输出重定向,将中止命令执行)

    • 因此,即使您的第一个命令也包含
      eval
      ,但直到您的第二个命令实际执行后,它的使用才成为一个问题
  • exec:“eval”:未在$PATH中找到可执行文件,因为如上所述,
    eval
    不是外部实用程序,而是shell内置工具,
    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'
更简单。