docker报错chown: cannot dereference ‘/proc/1/fd/1‘: Permission denied

  • Post author:
  • Post category:其他




问题

前几天在另一台服务器上通过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的,没办法,由于时间紧迫,我就提了个issue

chown: 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

  1. 查看是否安装SELinux

    在这里插入图片描述

  2. 查看SELinux是否开启

    在这里插入图片描述

    SELinux为关闭状态。

  3. 查看是否安装AppArmor

    在这里插入图片描述

    没有安装。



关闭firewalld和iptables

SELinux是关闭的、AppArmor没有安装。

后来从

firewalld 与 iptables


查阅到:

从Cent7以后,iptables服务的启动脚本已被忽略。请使用firewalld来取代iptables服务。

那么接着尝试关闭:

  1. 查看是否安装iptables
    在这里插入图片描述
  2. 查看iptables是否开启

    在这里插入图片描述

    是关闭的。
  3. 查看是否安装firewalld

    在这里插入图片描述
  4. 查看firewalld是否开启

    在这里插入图片描述
  5. 关闭firewalld

    在这里插入图片描述

做完上面这些,接着尝试重新运行Tomcat,结果curl还是失败,重新运行docker服务(

sudo systemctl restart docker

),还是不行。

快泪奔了!😭😭😭


那重启服务器试试,重启后,果然没问题了!

看来就是防火墙的问题啊。

但是重启后firewalld是开启的,因为服务开机自动运行的。这就很奇怪了,似乎与防火墙有关有很矛盾?


问题虽然解决了,但是留下了这个疑问。

先记录着,以后有空再好好研究下!



参考



支持🤟


  • 🎸

    [关注❤️我吧]

    ,我会持续更新的。
  • 🎸

    [点个👍赞吧]

    ,码字不易麻烦了。



版权声明:本文为oHaiKuoTianKong1682原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。