使用 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_USER
和POSTGRES_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 或脚本,您可以通过将sql
或sh
文件添加到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 文件?
Django 中的项目:我无法在终端中创建超级用户来操作 Postgresql 中的数据