繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM