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

4
我希望在Docker中创建PostgreSQL数据库,并与我的Django项目一起使用。我尝试使用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:

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

官方文档似乎指向了一个不同的Dockerfile。你尝试使用那个文件了吗? - airstrike
我不确定你的意思是我添加到帖子中的内容? - user7304253
我认为你可能困惑了Dockerfile如何处理多个FROM指令的问题。你能否也发布一下你的docker-compose.yml文件?你当前所做的是不可能的,但我可以提供建议。 - Andy Shinn
我会非常感激。我已经更新了帖子。 - user7304253
1个回答

3
首先,你的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文件添加到/docker-entrypoint-initdb.d/中的postgres镜像来实现。更多信息请参阅https://github.com/docker-library/docs/tree/master/postgres#how-to-extend-this-image

非常感谢,完美的答案,一切都正常工作。 - user7304253

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接