【问题标题】:Docker compose could not open directory permisson deniedDocker compose 无法打开目录权限被拒绝
【发布时间】:2018-11-06 11:11:36
【问题描述】:

谈到 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也会导致同样的错误。

【问题讨论】:

  • sudo docker-compose up -d?
  • 我做了,但是,权限被拒绝。 @PetarP
  • 在pycharm上,data/db文件夹上有一个小锁图标
  • 你启用 SELinux 了吗?尝试像这样挂载卷:./data/db:/var/lib/postgresql/data:z./data/db:/var/lib/postgresql/data:Z z 和 Z 卷标志是修改 selinux 标签的选项。
  • 检查docker是否有sudo权限,先尝试在终端播放

标签: django docker docker-compose


【解决方案1】:

我通过在卷定义末尾添加“: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?

【讨论】:

    【解决方案2】:

    您正在尝试将 ./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
    

    【讨论】:

    • 我完全按照你说的做了,在构建中,我得到了这个chmod: cannot access '/var/lib/postresql/data': No such file or directory ERROR: Service 'db' failed to build: The command '/bin/sh -c chmod -R 777 /var/lib/postresql/data' returned a non-zero code: 1,但我没有得到这个部分,抱歉; var/lib/.. 文件夹不应该在 docker 容器内吗?我们还没有创建它,但我们正在尝试更改权限?
    • 那是因为 /var/lib/postgresql/data 可能是由入口点创建的,所以在 postgresql 执行之前目录不存在。让我通过创建目录来编辑我的答案。
    • 好吧,这很奇怪,我可以看到 Step 1/3 : FROM postgres 已完成,Step 2/3 : RUN mkdir -p /var/lib/postgresql/data 已使用缓存完成,在 Step 3/3 : RUN chmod -R 777 /var/lib/postresql/data 时,chmod: cannot access '/var/lib/postresql/data': No such file or directory ERROR: Service 'db' failed to build: The command '/bin/sh -c chmod -R 777 /var/lib/postresql/data' returned a non-zero code: 1
    【解决方案3】:

    此解决方案适用于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 命令。

    【讨论】:

      猜你喜欢
      • 2018-10-01
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多