我想为我的Django项目mysite创建一个Docker映像,该映像具有两个应用程序轨道和两个用户。我使用docker build -t mysite
来构建我的docker镜像。我已经在dockerhub上写了一个Dockerfile。然后,我创建了 docker-compose.yml 文件和bash脚本 entypoint.sh ,我在docker-compose文件中使用了该脚本。
这些是我的文件:
Dockerfile:
FROM django:onbuild
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
docker-compose.yml:
version: '3'
services:
db:
image: postgres
restart: always
container_name: postgres_container
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=postgres
- DJANGO_SETTINGS_MODULE=mysite.settings_docker
ports:
- 5432:5432
volumes:
- /var/lib/postgresql/10/main
web:
image: mysite:latest
build:
context: .
dockerfile: Dockerfile
container_name: mysite_container
ports:
- "8000:8000"
depends_on:
- db
environment:
- DJANGO_SETTINGS_MODULE=mysite.settings_docker
entrypoint.sh
#!/bin/sh
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
exec "$@"
所以当我想启动整个容器时,我使用了以下命令
docker build .
docker-compose build
docker-compose up
settings.py中的数据库是
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'localhost',
'PORT': '5432',
}
}
我在容器中使用的settings_docker.py中的数据库是
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': '5432',
}
}
然后,我添加了新的 settings_docker.py ,在其中将主机设置为“ db”(在原始settings.py中,我拥有HOST='localhost'
,而当我使用{{1启动Django应用时}}我在docker-compose.yml中将所有表和关系都放在了froPostgreses数据库)文件中,并向我的Web服务中添加了环境变量python manage.py runserver
,容器正常启动了,但是现在我没有数据库关系和表了。
那么,如何将这些关系迁移到docker?用postgres中的关系填充docker容器的正确方法是什么?我尝试在 docker-compose.yml 中指定我的postgres数据文件(我的数据在DOCKER_SETTINGS_MODULE=mysite.settins_docker
中)的卷中,但是仍然无法正常工作。
答案 0 :(得分:1)
如果您考虑切换到另一种方法-提供DB初始状态的本机且可移植性*的解决方案是利用Django fixtures。使用该方法,您必须使数据库状态进入预期状态,这意味着要提供初始表和记录。准备就绪后,执行:
python manage.py dumpdata
为了将数据存储在文件中。然后,通过以下方式重复使用保存的文件:
python manage.py loaddata fixturename
另一种但不太灵活的方法是将.sql
文件提供给init-db位置-阅读手册,该手册特别取决于您的Postgres版本。
*便携式,意味着您可以操纵文件,发送文件,进行编辑并轻松地应用文件。