Docker создает ошибки, используя тома

avatar
Ricardo Schalch
8 апреля 2018 в 02:30
317
0
1

Вот что:

  1. Я хочу создать образ на основе python:latest для разработки Django.

  2. Я хочу создать проект Django ВНУТРИ КОНТЕЙНЕРА и заставить его отражаться в папке хоста через тома докеров.

  3. Я хочу использовать интерпретатор Python из контейнера для разработки.

    Таким образом, я могу иметь только свой Dockerfile, docker-compose.yml и requirements.txt в папке моего проекта, независимо от Python, virtualenvs или чего-то подобного на моем хосте.

Вот мой Dockerfile:

FROM python:latest
ARG requirements=requirements/production.txt
COPY ./app /app
WORKDIR /app
RUN pip install --upgrade pip && \
    pip install --no-cache-dir -r $requirements && \
    django-admin startproject myproject .
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

А вот мой файл docker-compose.yml:

version: '3'
services:
  web:
    build:
      context: .
      args:
        requirements: requirements/development.txt
    networks:
      - main
    depends_on:
      - postgres
    environment:
      - PYTHONUNBUFFERED=1
    ports:
      - "8000:8000"
    volumes:
      - "./app:/app:rw"
  postgres:
    image: postgres:latest
    networks:
      - main
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=123
    volumes:
      - ./data:/var/lib/postgresql/data
networks:
  main:

Основной проблемой являются тома в сети. Если я соберу образ через docker build -t somename:sometag ., сборка будет работать нормально. Если я запускаю docker run -it my_image bash, он показывает мне все файлы, созданные внутри /app.

Но если я попытаюсь docker-compose up, произойдет сбой веб-части, сообщение о том, что не удалось найти manage.py, и выход с кодом 2. После этого будет работать только Postgres.

Итак, наконец, мои вопросы:

Такой рабочий процесс возможен? Это лучший вариант, так как он не зависит от Python на хосте?

Большое спасибо.

Источник
JPG
8 апреля 2018 в 02:38
0

что произойдет, если вы удалите часть volume из docker-compose? (Я сделал то же самое с mysql)

Sraw
8 апреля 2018 в 02:45
0

Попробуйте использовать абсолютный путь в CMD.

Shoan
9 апреля 2018 в 10:44
0

Разве manage.py не находится за пределами каталога приложения на хосте?

Ricardo Schalch
9 апреля 2018 в 12:37
0

@JerinPeterGeorge: это работает, но убивает цель моего файла создания. @Sraw: та же ошибка, что и всегда: can't open file '/app/manage.py': [Errno 2] No such file or directory (сборка образа с помощью docker build работает, и файл есть) @Shoan: нет, он внутри папки приложения

Will Keeling
10 апреля 2018 в 16:56
0

Мы используем очень похожую настройку, и она отлично работает. Разница в том, что мы указываем команду в docker-compose.yml, а не CMD в самом DockerFile. Что произойдет, если вы удалите CMD из DockerFile и добавите command: ["python", "manage.py", "runserver", "0.0.0.0:8000"] к вашему docker-compose.yml?

Ricardo Schalch
11 апреля 2018 в 13:58
0

@WillKeeling, тот же результат, python: can't open file 'manage.py': [Errno 2] No such file or directory. Самое смешное, что все файлы создаются в простой сборке докера

Ответы (0)