docker报错chown: cannot dereference ‘/proc/1/fd/1‘: Permission denied
问题前几天在另一台服务器上通过docker部署wekan,执行docker-compose up -d没有报错,但是curl却无法访问。接着我尝试docker-compose up在前台运行容器,以便查看容器输出的信息。果然有一个报错wekan-db1 | chown: cannot dereference '/proc/1/fd/1': Permission denied。解决这个报错来自wek
问题
前几天在另一台服务器上通过docker部署wekan,执行docker-compose up -d
没有报错,但是curl却无法访问。
接着我尝试docker-compose up
在前台运行容器,以便查看容器输出的信息。果然有一个报错wekan-db1 | chown: cannot dereference '/proc/1/fd/1': Permission denied
。
解决
搜索issue
这个报错来自wekan-db1这个容器,db使用的是MongoDB,于是我在https://github.com/docker-library/mongo/issues中仔细搜索了下,果然有这个issue,解决方法是添加--user mongodb
参数。
于是我按照issue的解决方法,先用docker run的方式另外创建一个mongo容器,创建并运行命令为docker run --user mongodb --name mongo-test mongo:latest
,果然没有那个报错。而使用不带--user mongodb
参数的docker run --name mongo-test mongo:latest
是会有那个报错的。
于是我更加确定了,就是因为缺少--user mongodb
导致的。
于是我尝试在docker-compose.yml
文件中添加该配置,由于自己还不是很熟docker compose
,经过各种尝试配置的--user mongodb
都是不对的。
同时我也在docker的官方文档中以及Google中都搜索了,没有找到解决方法。或许是我眼花,其实官网有答案,只是我没看到。
提issue
虽然这个属于docker compose
的知识点,本不该在mongo中提issue的,没办法,由于时间紧迫,我就提了个issuechown: cannot dereference ‘/proc/1/fd/1’: Permission denied #465
。
过了2天终于有人回答了:
我按照他说的查阅了docker的文档,并在docker-compose.yml
文件中weandb
下添加了user: mongodb
。然后再次up,如果没有报错了。
但是执行curl还是不能访问。
此时我要奔溃了。
于是我仔细再看了一下他的回答,其中说到:
My guess is the error chown: cannot dereference ‘/proc/1/fd/1’: Permission denied is from the host’s SELinux or AppArmor, I’m not able to reproduce
说的就是是不是防火墙(SELinux or AppArmor)导致的权限不足。
测试Tomcat
我想运行Tomcat容器是不是也有问题呢?
于是,运行如下命令进行测试:
docker run --name tomcat -d -p 8082:8080 tomcat
果然curl访问失败,没有任何返回。
这个测试让我加大了对防火墙的怀疑。
关闭SELinux和AppArmor
-
查看是否安装SELinux
-
查看SELinux是否开启
SELinux为关闭状态。 -
查看是否安装AppArmor
没有安装。
关闭firewalld和iptables
SELinux是关闭的、AppArmor没有安装。
后来从firewalld 与 iptables
查阅到:
从Cent7以后,iptables服务的启动脚本已被忽略。请使用firewalld来取代iptables服务。
那么接着尝试关闭:
- 查看是否安装iptables
- 查看iptables是否开启
是关闭的。 - 查看是否安装firewalld
- 查看firewalld是否开启
- 关闭firewalld
做完上面这些,接着尝试重新运行Tomcat,结果curl还是失败,重新运行docker服务(sudo systemctl restart docker
),还是不行。
快泪奔了!😭😭😭
那重启服务器试试,重启后,果然没问题了!
看来就是防火墙的问题啊。
但是重启后firewalld是开启的,因为服务开机自动运行的。这就很奇怪了,似乎与防火墙有关有很矛盾?
问题虽然解决了,但是留下了这个疑问。
先记录着,以后有空再好好研究下!
参考
支持🤟
- 🎸 [关注❤️我吧],我会持续更新的。
- 🎸 [点个👍赞吧],码字不易麻烦了。
更多推荐
所有评论(0)