簡體   English   中英

Docker compose 無法打開目錄權限被拒絕

[英]Docker compose could not open directory permisson denied

說到 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也會導致同樣的錯誤。

我通過在卷定義的末尾添加“: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

docker 容器的volumes-from 選項中的'z' 標志是什么?

您正在嘗試在/var/lib/postgresql/data安裝./data/db並且您正在使用非特權用戶執行 docker-compose 。

所以,我們可以有兩種可能:

  1. ./data/db 權限問題。
  2. /var/lib/postgresql/data 的問題

最簡單的解決方案是使用特權用戶(root)執行 docker-compose,但如果你不想這樣做,你可以試試這個:

  • 授予 ./data/db 權限(我看到您已經完成了編輯)。
  • 授予權限 /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

此解決方案適用於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命令。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM