我正在使用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
我将对如何创建表的指导表示赞赏。
我不想输入psql来输入
您可以简单地使用容器的内置init机制:
COPY init.sql /docker-entrypoint-initdb.d/10-init.sql
这样可以确保在正确启动数据库服务器后执行您的sql。
看一看他们的入口点脚本。它做了一些准备工作,以正确和外观到启动PSQL /docker-entrypoint- initdb.d/目录在结尾的文件.sh,.sql和.sql.gz。
/docker-entrypoint- initdb.d/
.sh
.sql
.sql.gz
10-文件名中的原因是因为文件以ASCII顺序处理。你能说出你的其他的init文件,如20-create-tables.sql和30-seed- tables.sql.gz例如,并确保他们在需要的顺序进行处理。
10-
20-create-tables.sql
30-seed- tables.sql.gz
另请注意,调用命令未指定数据库。如果要迁移到docker-compose并且现有.sql文件也未指定DB ,请记住这一点。
不过,您的文件将在容器的第一个开始build阶段进行处理。由于Docker Compose会先停止映像然后再恢复图像,所以几乎没有什么区别,但是如果您在build阶段初始化数据库至关重要,我建议您仍然使用内置的init方法,方法是/docker- entrypoint.sh从dockerfile 调用然后在/docker-entrypoint-initdb.d/目录中进行清理。
build
/docker- entrypoint.sh
/docker-entrypoint-initdb.d/