Docker compose не может открыть директорию - PullRequest
0 голосов
/ 06 ноября 2018

Я совершенно новичок, когда дело доходит до Докера. И я пытаюсь понять это с помощью фиктивного проекта. У меня есть проект 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 также приводит к той же ошибке.

Ответы [ 2 ]

0 голосов
/ 14 июня 2019

Я решил, добавив ": 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

что такое флаг 'z' в параметре тома-контейнера docker-контейнера?

0 голосов
/ 06 ноября 2018

Вы пытаетесь смонтировать ./data/db в /var/lib/postgresql/data, и вы выполняете docker-compose с непривилегированным пользователем.

Итак, у нас может быть две возможности:

  1. Проблема с разрешениями ./data/db.
  2. Проблема с / var / lib / postgresql / data

Самое простое решение - выполнить docker-compose с привилегированным пользователем (root), но если вы не хотите этого делать, вы можете попробовать это:

  • Дайте разрешения ./data/db (я вижу, что вы отредактировали, что вы уже сделали это).
  • Предоставить разрешения для / var / lib / postgresql / data

Как вы можете дать / var / lib / postgresql / data разрешения? Прочитайте следующие строки:

Во-первых, обратите внимание, что / var / lib / postgresql / data автоматически генерируется postgre Docker, поэтому вам нужно определить новый Dockerfile, который изменяет эти разрешения. После этого вам нужно также изменить docker-compose для использования этот новый Dockerfile.

. / Докер-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
...