![](/img/trans.png)
[英]Properly migrating Postgres database to Docker/Django/Heroku/Postgres
[英]How to properly populate Docker Django image with data from Postgres?
我想为我的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
泊坞窗,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'
,当我使用python manage.py runserver
启动Django应用时,我拥有了所有的表和关系froPostgreses数据库)文件,并在docker-compose.yml中将环境变量DOCKER_SETTINGS_MODULE=mysite.settins_docker
添加到我的Web服务中,并且容器正常启动,但是现在我没有数据库关系和表。
那么,如何将这些关系迁移到docker? 用postgres中的关系填充docker容器的正确方法是什么? 我已经尝试在docker-compose.yml中使用卷来指定我的postgres数据文件(我的数据在/var/lib/postgresql/10/main
),但是它仍然无法正常工作。
如果您考虑切换到另一种方法-提供DB初始状态的本机且可移植性*的解决方案是利用Django 固定装置 。 使用该方法,您必须使数据库状态进入预期状态,这意味着要提供初始表和记录。 准备就绪后,执行:
python manage.py dumpdata
为了将数据存储在一个文件中。 然后,通过以下方式重复使用保存的文件:
python manage.py loaddata fixturename
另一种但不太灵活的方法是将.sql
文件提供到init-db位置-阅读手册,该手册具体取决于您的Postgres版本。
*便携式,意味着您可以操纵,发送,编辑文件并轻松应用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.