使用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.sql
和30-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不是这样,所以我想我会把它叫出来。