Docker Compose无法打开目录权限被拒绝

时间:2018-11-06 11:11:36

标签: django docker docker-compose

关于Docker,我完全是一个新手。我试图通过一个虚拟项目来理解它。 我有一个django项目,而我的Dockerfile在Django项目的根文件夹中。我的docker-compose.yml文件位于顶部的根文件夹下,其中包含django项目文件夹和其他配置文件。

我的docker-compose.yml

version: '3'
services:
  db:
    image: postgres
    container_name: dummy_project_postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data

  event_planner:
    build: ./dummy_project
    container_name: dummy_project
    volumes:
      - .:/web
    ports:
      - "8000:8000"
    depends_on:
      - db
    links:
      - db:postgres

和我的Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /web
WORKDIR /web
ADD requirements.txt /web/
RUN pip install -r requirements.txt
ADD . /web/

我正在尝试运行以下命令

# stop and remove the existing containers
docker-compose stop
docker-compose rm -f

# up and run the container
docker-compose build
docker-compose up -d

docker-compose exec dummy_project bash

当我执行docker-compose up -d时,会看到此错误。

docker-compose up -d                                                                         
dummy_project_postgres is up-to-date
Starting dummy_project ... done
warning: could not open directory 'data/db/': Permission denied

我以前曾问过这个问题,但是我并没有完全找到所需的解决方案,现在我已经呆了几个小时。

编辑:我拥有顶部文件夹下所有文件夹的所有权限
EDIT2: sudo docker-compose up -d也导致相同的错误。

3 个答案:

答案 0 :(得分:1)

此解决方案适用于 your user 组中不存在 docker 的情况。

  1. 首先检查您的用户是否在 docker 组中:
grep 'docker' /etc/group
  1. 将用户添加到 docker 组:
  • 如果命令返回为空,则创建docker组:
sudo groupadd docker
  • 否则,如果您的用户不在命令返回中,则将他添加到组中:
sudo usermod -aG docker $USER
  1. 重启系统

  2. 再次测试:

docker run hello-world
<块引用>

提示:记得启动docker服务

如果有效,请再次尝试您的 docker-compose 命令。

答案 1 :(得分:0)

您正在尝试将./data/db挂载到/var/lib/postgresql/data中,并且正在以非特权用户执行docker-compose。

因此,我们可以有两种可能性:

  1. 具有./data/db权限的问题。
  2. / var / lib / postgresql / data的问题

最简单的解决方案是使用特权用户(root)执行docker-compose,但如果您不想这样做,可以尝试以下方法:

  • 授予./data/db的权限(我已经看到您的EDIT,您已经完成了此操作)。
  • 授予对/ var / lib / postgresql / data的权限

如何授予/ var / lib / postgresql / data权限?阅读以下几行:

  

首先,请注意/ var / lib / postgresql / data由postgre自动生成   docker,因此,您需要定义一个新的Dockerfile来修改这些   权限。之后,您还需要修改docker-compose以使用   这个新的Dockerfile。

./ docker-compose.yml

version: '3'
services:
  db:
    build: 
      context: ./mypostgres
      dockerfile: Dockerfile_mypostgres
    container_name: dummy_project_postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data

  event_planner:
    build: ./dumy_project
    container_name: dummy_project
    volumes:
      - .:/web
    ports:
      - "8000:8000"
    depends_on:
      - db
    links:
      - db:postgres

./ dumy_project / Dockerfile ->无需更改

./ mypostgres / Dockerfile_mypostgres

FROM postgres
RUN mkdir -p /var/lib/postgresql/data
RUN chmod -R 777 /var/lib/postresql/data
ENTRYPOINT docker-entrypoint.sh

答案 2 :(得分:0)

我通过在体积定义的末尾添加“:z”来解决

version: '3'
services:
  db:
    image: postgres
    container_name: dummy_project_postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data:z

  event_planner:
    build: ./dummy_project
    container_name: dummy_project
    volumes:
      - .:/web
    ports:
      - "8000:8000"
    depends_on:
      - db
    links:
      - db:postgres

“:z”的含义

  

像SELinux这样的标签系统要求在其上贴上适当的标签   将大量内容装入容器中。没有标签,安全性   系统可能会阻止容器中运行的进程   使用内容。默认情况下,Docker不更改标签集   通过操作系统。

     

要更改容器上下文中的标签,可以添加以下任一   卷安装有两个后缀:z或:Z。这些后缀告诉Docker   重新标记共享卷上的文件对象。 z选项说明   Docker表示两个容器共享卷内容。结果是,   Docker使用共享的内容标签来标记内容。共享量   标签允许所有容器读取/写入内容。 Z选项说明   Docker使用私有非共享标签来标记内容。只有   当前容器可以使用私有卷。

https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container---volumes-from

what is 'z' flag in docker container's volumes-from option?