使用 Django 项目在 Docker 中创建 postgresql 数据库

Posted

技术标签:

【中文标题】使用 Django 项目在 Docker 中创建 postgresql 数据库【英文标题】:Creating postgresql database in Docker with Django project 【发布时间】:2017-12-09 12:18:58 【问题描述】:

我想用我的 Django 项目在 docker 中创建 postgresql 数据库。我正在尝试使用init.sql 文件来执行此操作,但它不起作用:

settings.py:

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'aso',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    

init.sql:

CREATE USER postgres;
CREATE DATABASE aso;
GRANT ALL PRIVILEGES ON DATABASE aso TO postgres;

我更新的Dockerfile

FROM python:3.6.1
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install -r requirements.txt
ADD . /code/
FROM library/postgres
ADD init.sql /docker-entrypoint-initdb.d/

不幸的是我得到了:

db_1   | LOG:  database system was shut down at 2017-07-05 14:02:41 UTC
web_1  | /usr/local/bin/docker-entrypoint.sh: line 145: exec: python3: not found
db_1   | LOG:  MultiXact member wraparound protections are now enabled
db_1   | LOG:  autovacuum launcher started
db_1   | LOG:  database system is ready to accept connections
dockerpri_web_1 exited with code 127

我也在尝试这个Dockerfile

FROM python:3.6.1
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install -r requirements.txt
ADD . /code/
FROM library/postgres
ENV POSTGRES_USER docker
ENV POSTGRES_PASSWORD docker
ENV POSTGRES_DB aso

我的docker-compose.yml

version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python3 PROJECT/backend/project/manage.py runserver 0.0.0.0:8001
    volumes:
      - .:/code
    ports:
      - "8001:8001"
    depends_on:
      - db

【问题讨论】:

official docs 似乎指向不同的 Dockerfile。您是否尝试过使用它? 我不确定你的意思是我在帖子中添加的内容? 我想您可能对Dockerfile 如何处理多个FROM 指令感到困惑。您也可以发布您的docker-compose.yml 吗?你目前正在做的事情是不可能的,但我可以提供一个建议。 我将不胜感激。我已经更新了帖子。 【参考方案1】:

首先,您的 Dockerfile 示例无效。它应该只有一条FROM 指令。删除 PostgreSQL 的东西,所以它只是:

FROM python:3.6.1
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip3 install -r requirements.txt
ADD . /code/

接下来,我将回答如何创建 PostgreSQL 用户和数据库的问题,因为那是您的 init.sql 正在做的事情。

根据https://hub.docker.com/_/postgres/ 的postgres 图像文档,我们可以使用POSTGRES_USERPOSTGRES_PASSWORD 环境变量。 POSTGRES_USER 变量将创建一个用户和对该用户具有权限的数据库。修改您的docker-compose.yml 的示例是:

version: '3'

services:
  db:
    image: postgres
    environment:
      POSTGRES_USER: aso
      POSTGRES_PASSWORD: somepass
  web:
    build: .
    command: python3 PROJECT/backend/project/manage.py runserver 0.0.0.0:8001
    volumes:
      - .:/code
    ports:
      - "8001:8001"
    depends_on:
      - db

在启动时,这将使用用户名aso、数据库aso 和密码somepass 初始化PostgreSQL 数据库。然后,您可以修改您的 settings.py 以使用此用户名、数据库和密码。

我还要补充一点,如果您想在数据库启动期间运行其他任意 SQL 或脚本,您可以通过将sqlsh 文件添加到postgres 图像/docker-entrypoint-initdb.d/ 来实现。在https://github.com/docker-library/docs/tree/master/postgres#how-to-extend-this-image 阅读更多相关信息。

【讨论】:

非常感谢,完美的回答,一切正常。

以上是关于使用 Django 项目在 Docker 中创建 postgresql 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 项目中创建 requirements.txt 文件?

Linux中创建Django项目

在命令行中创建Django项目

Django 中的项目:我无法在终端中创建超级用户来操作 Postgresql 中的数据

如何在 Netbeans 8.0.2 中创建 Django 项目

Djano + Nginx + docker配置与管理