"许可被拒绝"在Docker容器中,除非--privileged = true

时间:2016-09-14 09:39:34

标签: linux nginx docker permissions docker-compose

我尝试将nginx容器作为服务运行,并在主机和容器之间共享2个卷,以便一个目录中的文件自动与另一个配对目录共享。

我的docker-compose.yml如下:

version: '2'

services:
  nginx:
    image: nginx
    build: .
    ports:
     - "5000:80"
    volumes:
     - /home/user1/share:/share/user1
     - /home/user2/share:/share/user2
    restart: always

我目前唯一能让它工作的方法是将privileged: true添加到docker-compose文件中,但由于安全性要求,我不允许这样做。

尝试访问容器中的卷时,出现以下错误:

[root@host docker-nginx]# docker exec -it dockernginx_nginx_1 bash
root@2d574f9c6131:/# ls /share/user1/
ls: cannot open directory /share/user1/: Permission denied

即使将自己附加到具有以下参数的容器上,也会让我无法访问资源(或至少列出内容):
docker exec -it --privileged=true -u 6004:6004 dockernginx_nginx_1 bash
(注意:6004:6004恰好是id:gid所有权传递给/share/user1/

有没有办法在不使用提升权限构建nginx service的情况下访问内容?

也许问题在于容器中强制执行的SELinux限制? 容器正在运行Debian GNU/Linux 8 (jessie),主机正在运行CentOS Linux 7 (Core)

相关问题:

1 个答案:

答案 0 :(得分:2)

Docker正在运行--selinux-enabled=true,这禁止我访问容器中目录的内容 阅读更多:http://www.projectatomic.io/blog/2016/07/docker-selinux-flag/

解决方案是禁用它,它可以通过(1)配置或(2)安装非selinux CentOS软件包完成,我选择了2:

我确保重新安装和更新Docker从1.10到1.12.1并且不安装docker-engine-selinux.noarch,而是安装docker-engine.x86_64并安装SELinux软件包作为依赖项(yum会自动执行此操作)。通过执行此操作并启动Docker守护程序,您可以使用ps aux | grep "docker"验证docker-containerd未使用--selinux-enabled=true选项启动cron(5,15,25,35,45,55 * * * ? *)