Django Startapp рабочий процесс с докером - PullRequest
1 голос
/ 15 мая 2019

Меня смущает, как работать с приложениями Django (создавать / использовать) при использовании Docker.В некоторых руководствах предлагается использовать команду startapp после запуска контейнера веб-докера (я использую docker-compose для запуска контейнеров).Но так как файлы создаются внутри этого контейнера, как мне добавить код к этому с моей локальной машины разработчика?и, кроме того, кажется неправильным создавать подобные приложения для редактирования кода ...

Я использовал следующую структуру, которая до сих пор запускает контейнер и работает нормально.Но только с одним «приложением», которое является todo (взято из https://github.com/realpython/dockerizing-django)

.
├── README.md
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   └── sites-enabled
│       └── django_project
├── production.yml
├── tmp.json
└── web
    ├── Dockerfile
    ├── Pipfile
    ├── Pipfile.lock
    ├── docker_django
    │   ├── __init__.py
    │   ├── apps
    │   │   ├── __init__.py
    │   │   └── todo
    │   │       ├── __init__.py
    │   │       ├── admin.py
    │   │       ├── models.py
    │   │       ├── static
    │   │       │   └── main.css
    │   │       ├── templates
    │   │       │   ├── _base.html
    │   │       │   ├── dashboard.html
    │   │       │   └── home.html
    │   │       ├── tests.py
    │   │       ├── urls.py
    │   │       └── views.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── manage.py
    ├── requirements.txt
    ├── shell-script.sh
    └── tests
        ├── __init__.py
        └── test_env_settings.py

Когда я использую вышеупомянутую структуру, я не могу создавать приложения локально, так как мы должны использовать manage.py для созданияприложения, но мне нужно перейти в папку приложений, чтобы сделать это, но manage.py недоступен. Поэтому я пытаюсь указать полный путь к abs для manage.py, но он жалуется на ошибку SeTTINGS_MODULE SECRET_KEY.

Чтоявляется правильным способом работы с приложениями django при использовании Docker-Compose?

Нужно ли изменять вышеуказанную структуру? или мне следует изменить рабочий процесс?

РЕДАКТИРОВАТЬ:

мой docker-compose:

version: '3.7'

services:
  web:
    restart: always
    build: ./web
    expose:
      - "8000"
    links:
      - postgres:postgres
      - redis:redis
    volumes:
      - web-django:/usr/src/app
      - web-static:/usr/src/app/static
    env_file: .env
    environment:
      DEBUG: 'true'
    command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000

  nginx:
    restart: always
    build: ./nginx/
    ports:
      - "80:80"
    volumes:
      - web-static:/usr/src/app/static
    links:
      - web:web

  postgres:
    restart: always
    image: postgres:latest
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data/

  pgadmin:
    restart: always
    image: fenglc/pgadmin4
    ports:
      - "5050:5050"
    volumes:
      - pgadmindata:/var/lib/pgadmin/data/
    environment:
      DEFAULT_USER: 'pgadmin4@pgadmin.org'
      DEFAULT_PASSWORD: 'admin'

  redis:
    restart: always
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - redisdata:/data

volumes:
  web-django:
  web-static:
  pgdata:
  redisdata:
  pgadmindata:

Мой Dockerfile внутри веб-папки:

FROM python:3.7-slim

# Set environment variables

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ADD Pipfile /usr/src/app
ADD Pipfile.lock /usr/src/app

RUN python -m pip install --upgrade pip

RUN python -m pip install pipenv

COPY requirements.txt requirements.txt
RUN pipenv install --system

COPY . /usr/src/app

1 Ответ

1 голос
/ 15 мая 2019

ваша структура верна. то, что вы ищете, это том , чтобы сделать ваш проект django на хосте доступным внутри контейнера, вы можете создать все, что вам нравится в вашем проекте, и изменения вступят в силу для контейнера.

например:

структура:

.
├── django
│   ├── Dockerfile
│   └── entireDjangoAppFiles
└── docker-compose.yml

скажи, что это мой django dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
RUN pip install Django psycopg2
EXPOSE 8000
CMD python manage.py runserver 0.0.0.0:8000

и мой докер сочиняет:

version: '3.7'
services:
  django:
    build:
      context: django
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    volumes:
      - "./django:/code" 

теперь любые изменения, которые я делаю в моей директории django, будут применяться и к /code dir контейнера

EDIT

наши файлы docker-compose не похожи ... вы используете именованные тома вместо обычного монтажа. эти тома создаются собственной папкой томов Docker, и контейнеры могут их использовать, но ничто не говорит Docker, что вы хотите, чтобы эти тома содержали ваши приложения - поэтому они пусты. чтобы исправить это, вы можете просто удалить их из опции volumes в вашем docker-compose и предпочесть mount-volume:

version: '3.7'

services:
  web:
    restart: always
    build: ./web
    expose:
      - "8000"
    links:
      - postgres:postgres
      - redis:redis
    volumes:
      - .web:/usr/src/app #mount the project dir
      - .path/to/static/files/dir:/usr/src/app/static #mount the static files dir
    env_file: .env
    environment:
      DEBUG: 'true'
    command: /usr/local/bin/gunicorn docker_django.wsgi:application -w 2 -b :8000

  nginx:
    restart: always
    build: ./nginx/
    ports:
      - "80:80"
    volumes:
      - web-static:/usr/src/app/static
    links:
      - web:web

  postgres:
    restart: always
    image: postgres:latest
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data/

  pgadmin:
    restart: always
    image: fenglc/pgadmin4
    ports:
      - "5050:5050"
    volumes:
      - pgadmindata:/var/lib/pgadmin/data/
    environment:
      DEFAULT_USER: 'pgadmin4@pgadmin.org'
      DEFAULT_PASSWORD: 'admin'

  redis:
    restart: always
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - redisdata:/data

volumes:
  #web-django:
  #web-static:
  pgdata:
  redisdata:
  pgadmindata:

примечание о других именованных томах - если вам интересно, зачем вам их использовать - это тома баз данных, которые должны быть заполнены контейнерами.

...