![](/img/trans.png)
[英]Django collectstatic Permission denied with 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 使用私有的非共享標簽來標記內容。 只有當前容器可以使用私有卷。
您正在嘗試在/var/lib/postgresql/data
安裝./data/db
並且您正在使用非特權用戶執行 docker-compose 。
所以,我們可以有兩種可能:
最簡單的解決方案是使用特權用戶(root)執行 docker-compose,但如果你不想這樣做,你可以試試這個:
您如何授予 /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
組中的情況。
docker
組中:grep 'docker' /etc/group
docker
組:sudo groupadd docker
sudo usermod -aG docker $USER
重新啟動系統
再測試一下:
docker run hello-world
提示:記得啟動docker服務
如果有效,請再次嘗試您的docker-compose
命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.