用Django项目在Docker中创buildpostgresql数据库

我想用我的Django项目在docker中创buildpostgresql数据库。 我正在尝试使用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 

首先,您的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/ 

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

根据https://hub.docker.com/_/postgres/上的postgres映像文档,我们可以使用POSTGRES_USERPOSTGRES_PASSWORD环境variables。 POSTGRES_USERvariables将创build一个具有该用户特权的用户和数据库。 一个修改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 

在开始时,这将使用用户名somepasssomepass数据库和somepass密码初始化PostgreSQL数据库。 然后,你可以修改你的settings.py来使用这个用户名,数据库和密码。

我还要补充一点,如果你想在数据库启动时运行其他任意的SQL或者脚本,你可以通过在/docker-entrypoint-initdb.d/postgres映像中添加sqlsh文件来/docker-entrypoint-initdb.d/ 。 阅读更多关于这个在https://github.com/docker-library/docs/tree/master/postgres#how-to-extend-this-image