关于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
也导致相同的错误。
答案 0 :(得分:1)
此解决方案适用于 your user
组中不存在 docker
的情况。
docker
组中:grep 'docker' /etc/group
docker
组:sudo groupadd docker
sudo usermod -aG docker $USER
重启系统
再次测试:
docker run hello-world
<块引用>
提示:记得启动docker服务
如果有效,请再次尝试您的 docker-compose
命令。
答案 1 :(得分:0)
您正在尝试将./data/db
挂载到/var/lib/postgresql/data
中,并且正在以非特权用户执行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
答案 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使用私有非共享标签来标记内容。只有 当前容器可以使用私有卷。