Я новичок в 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 также приводит к той же ошибке.

6
alexa 6 Ноя 2018 в 14:11

2 ответа

Лучший ответ

Вы пытаетесь смонтировать ./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, поэтому вам необходимо определить новый файл 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
0
mulg0r 6 Ноя 2018 в 14:04

Я решил, добавив ": 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' в опции "Тома из докера"?

6
Farid Escate 14 Июн 2019 в 00:59