使用docker-compose在postgresql数据库中创build表

我正在使用docker-compose来部署一个multicontainer python Flask Web应用程序。 我很难理解如何在构build过程中在postgresql数据库中创build表,所以我不必使用psql手动添加它们。

我的docker-compose.yml文件是:

web: restart: always build: ./web expose: - "8000" links: - postgres:postgres volumes: - /usr/src/flask-app/static env_file: .env command: /usr/local/bin/gunicorn -w 2 -b :8000 app:app nginx: restart: always build: ./nginx/ ports: - "80:80" volumes: - /www/static volumes_from: - web links: - web:web data: restart: always image: postgres:latest volumes: - /var/lib/postgresql command: "true" postgres: restart: always image: postgres:latest volumes_from: - data ports: - "5432:5432" 

我不想inputpsql为了input:

 CREATE DATABASE my_database; CREATE USER this_user WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE "my_database" to this_user; \i create_tables.sql 

我将不胜感激关于如何创build表的指导。

我不想inputpsql为了input

你可以简单地使用容器的内置init机制:

COPY init.sql /docker-entrypoint-initdb.d/10-init.sql

这可以确保在DB服务器正确启动后执行sql。

看看他们的入口脚本 。 它做了一些准备,正确启动psql,并查看以.sh.sql.sql.gz结尾的文件/docker-entrypoint-initdb.d/目录。

10-文件名是因为文件按ASCII顺序处理。 你可以命名你的其他init文件,例如20-create-tables.sql30-seed-tables.sql.gz ,并确保它们是按照你的需要进行处理的。

另请注意,调用命令不会指定数据库。 请记住,如果您迁移到docker-compose,并且现有的.sql文件不指定数据库。

虽然你的文件将在容器的第一次启动时被处理。 由于Docker Compose会停止图像然后恢复它们,所以几乎没有区别,但是如果在build阶段初始化数据库至关重要,我build议仍然使用内置的init方法,从dockerfile调用/docker-entrypoint.sh,然后清理/docker-entrypoint-initdb.d/目录。

我将创build表作为构build过程的一部分。 在新目录中创build一个新的Dockerfile ./database/

 FROM postgres:latest COPY . /fixtures WORKDIR /fixtures RUN /fixtures/setup.sh 

./database/setup.sh看起来像这样:

 #!/bin/bash set -e /etc/init.d/postgresql start psql -f create_fixtures.sql /etc/init.d/postgresql stop 

把你的创build用户,创build数据库,创build表sql(和任何其他夹具数据)到./database/目录中的create_fixtures.sql文件。

最后你的postgres服务将更改为使用build

 postgres: build: ./database/ ... 

注意:有时你需要在/etc/init.d/postgresql start行之后进行sleep 5 (或者甚至更好的脚本来轮询和等待postgresql启动)。 根据我的经验,init脚本或者psql客户端为你处理这个问题,但是我知道mysql不是这样,所以我想我会把它叫出来。