如何使用来自Postgres的数据正确填充Docker Django映像?

时间:2018-08-23 06:44:17

标签: django database postgresql docker docker-compose

我想为我的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中)的卷中,但是仍然无法正常工作。

1 个答案:

答案 0 :(得分:1)

如果您考虑切换到另一种方法-提供DB初始状态的本机且可移植性*的解决方案是利用Django fixtures。使用该方法,您必须使数据库状态进入预期状态,这意味着要提供初始表和记录。准备就绪后,执行:

python manage.py dumpdata

为了将数据存储在文件中。然后,通过以下方式重复使用保存的文件:

python manage.py loaddata fixturename

另一种但不太灵活的方法是将.sql文件提供给init-db位置-阅读手册,该手册特别取决于您的Postgres版本。

*便携式,意味着您可以操纵文件,发送文件,进行编辑并轻松地应用文件。