如何在Docker中使用>>操作符?容器内文件追加问题
解决Docker Exec中重定向操作符>>不生效的问题
你遇到的问题核心原因很明确:>>是宿主机shell的重定向操作符,当你直接执行sudo docker exec ... echo "my new line" >> /etc/postfix/main.cf时,宿主机的bash会先解析>>,尝试把echo的输出追加到宿主机本地的/etc/postfix/main.cf文件里——而这个文件在宿主机上不存在,所以才会报错。
要让重定向在容器内部生效,你需要让容器内的shell来处理>>操作,有两种常用的方法:
方法一:通过容器内的shell执行完整命令
把你要执行的命令用单引号包裹,交给容器内的sh或bash(取决于容器里安装的shell)来执行,需要加上-c参数告诉shell执行后面的命令字符串:
使用/bin/sh(兼容性更好,大部分轻量镜像都有)
sudo docker exec --interactive mycontainer /bin/sh -c 'echo "my new line" >> /etc/postfix/main.cf'
使用/bin/bash(如果容器里安装了bash)
sudo docker exec --interactive mycontainer /bin/bash -c 'echo "my new line" >> /etc/postfix/main.cf'
这种方式下,整个命令(包括>>)都会在容器内部的shell中被解析,自然就能正确追加内容到容器内的文件了。
方法二:通过管道传递内容到容器内的追加命令
你也可以在宿主机生成内容,然后通过管道把内容传给容器内的cat或tee命令来实现追加:
使用cat命令
echo "my new line" | sudo docker exec --interactive mycontainer cat >> /etc/postfix/main.cf
使用tee命令(避免宿主机输出重复内容)
tee -a同样是追加内容的作用,加上>/dev/null可以防止内容在宿主机的终端上重复输出:
echo "my new line" | sudo docker exec --interactive mycontainer tee -a /etc/postfix/main.cf > /dev/null
额外注意事项
- 确保容器内的用户有写入
/etc/postfix/main.cf的权限,如果没有,你可能需要加上--user root参数以root身份执行命令:sudo docker exec --user root --interactive mycontainer /bin/sh -c 'echo "my new line" >> /etc/postfix/main.cf' - 如果容器里没有
sh或bash(比如某些极端精简的镜像),可以尝试用容器内已有的其他shell或者直接使用echo命令结合管道的方式。
内容的提问来源于stack exchange,提问作者Arthur Attout




