我正在使用docker-compose来部署多容器python Flask Web应用程序。我在构建期间很难理解如何在postgresql数据库中创建表,所以我不必用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"
我不想输入psql才能输入:
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
我很感激如何创建表格的指导。
答案 0 :(得分:25)
我不想输入psql才能输入
您可以简单地使用容器的内置初始化机制:
COPY init.sql /docker-entrypoint-initdb.d/10-init.sql
这确保在正确启动DB服务器后执行sql。
看看他们的入口点script。它为正确启动psql做了一些准备,并在/docker-entrypoint-initdb.d/
目录中查找以.sh
,.sql
和.sql.gz
结尾的文件。
10-
是因为文件是按ASCII顺序处理的。您可以为其他初始文件命名,例如20-create-tables.sql
和30-seed-tables.sql.gz
,并确保按照您的需要处理它们。
另请注意,调用命令does not指定数据库。如果您正在迁移到docker-compose并且现有的.sql
文件也没有指定DB,请记住这一点。
您的文件将在容器的build
阶段的首次启动时处理。由于Docker Compose会停止图像然后恢复它们,因此几乎没有区别,但如果在build
阶段初始化数据库至关重要,我建议仍使用内置的init方法从dockerfile调用/docker-entrypoint.sh
,然后在/docker-entrypoint-initdb.d/
目录清理。
答案 1 :(得分:11)
它不适用于Dockerfile中的COPY方法。但是我设法通过添加以下内容来运行init.sql文件:
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
进入我的docker-compose.yml。 init.sql与我的docker-compose.yml位于同一目录中。 我在这里查看了解决方案:https://gist.github.com/vrulevskyi/307b08abddc9568cf8f9c1b429c1ab56
答案 2 :(得分:9)
我会在构建过程中创建表格。在新目录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
将您的create user,create database,create table sql(以及任何其他fixture数据)放入create_fixtures.sql
目录中的./database/
文件中。
最后,您的postgres
服务将更改为使用build
:
postgres:
build: ./database/
...
注意:有时您需要在sleep 5
行之后使用/etc/init.d/postgresql start
(甚至更好的脚本来轮询并等待postgresql启动)。根据我的经验,init脚本或psql客户端都会为你处理这个问题,但我知道mysql并不是这样,所以我想我会把它叫出去。