Docker的Django startapp工作流程

时间:2019-05-15 09:39:12

标签: django docker django-rest-framework docker-compose

我对使用Docker时如何使用Django应用程序(创建/使用)感到困惑。一些教程建议在启动Web docker容器后使用命令startapp(我正在使用docker-compose来建立容器)。但是,由于文件是在该容器内创建的,我该如何从本地开发计算机向其添加代码?而且,创建像这样的应用来编辑代码似乎不正确...

到目前为止,我一直在使用以下结构,它可以启动容器并正常工作。但是只有一个要做的“应用” (摘自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来创建应用程序,因此无法在本地创建应用程序,但是我需要导航到apps文件夹来执行此操作,但是manage.py无法访问。因此,我尝试为manage.py提供完整的Abs路径,但它抱怨SeTTINGS_MODULE SECRET_KEY错误。

使用Docker-Compose时使用django应用程序的正确方法是什么?

我需要更改上述结构吗?还是应该更改工作流程?

编辑:

我的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:

我在Web文件夹中的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 个答案:

答案 0 :(得分:0)

您的结构正确。您要寻找的是volume,要使主机上的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

和我的docker组成:

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

现在我在django目录中所做的任何更改也将应用到容器的/code目录中

编辑

我们的docker-compose文件不相似...您正在使用named volumes 而不是通常的安装。这些卷将被创建为Docker自己的卷目录,并且容器可以使用它们,但是没有任何内容告诉docker您希望这些卷包含您的应用程序-因此它们为空。要解决此问题,您可以将它们从docker-compose中的volumes选项中删除,而更喜欢使用mount-volumes:

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:

关于其他命名卷的说明-如果您想知道为什么必须使用它们-它们是数据库卷,应该由容器填充。