我对使用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
答案 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:
关于其他命名卷的说明-如果您想知道为什么必须使用它们-它们是数据库卷,应该由容器填充。