在我的简单场景中,我有一个简单的Flask
应用程序以这种方式连接到postgres:
SQLALCHEMY_DATABASE_URI='postgresql://username:secretpassword@postgres:5432/myproj'
我有一个简单的docker-compose.yml
:
version: '2'
services:
postgres:
image: postgres:latest
volumes_from:
- data
environment:
POSTGRES_PASSWORD: secretpassword
POSTGRES_USER: username
POSTGRES_DB: myproj
ports:
- "5432:5432"
web:
build: .
volumes_from:
- app
ports:
- "5000:5000"
depends_on:
- postgres
data:
image: postgres:latest
volumes:
- /var/lib/postgresql/data
command: "true"
app:
build: .
volumes:
- .:/myproj
command: "true"
我需要在自己制作烧瓶脚本的午餐时间,为我的应用创建表格:
export FLASK_APP='./myproj/__init__.py'
flask createdbs
我已将这两项操作放在Dockerfile
服务的web
中,但因为我的服务和postgres
服务之间存在depends_on
关系,所以postgres db host是在建设阶段没有。
有关实现此目标的最佳方法的任何建议吗?我想避免黑客攻击,我更愿意尊重正确的Docker工作流程。
答案 0 :(得分:0)
一种方法是使用"命令"关键词: https://docs.docker.com/compose/compose-file/#/command (另请参阅entrypoint关键字)
web:
build: .
volumes_from:
- app
ports:
- "5000:5000"
depends_on:
- postgres
command: "export FLASK_APP='./myproj/__init__.py' && flask createdbs"
或使用命令启动您的刻录脚本并将其导出到dockerfile中。
请注意" depends_on"只能在另一个容器之前启动一个容器,但不要等待你的postgres数据库准备就绪。如果你想等到postgres准备回答,你可以使用" wait-for-it.sh postgres:5432"等脚本。这在docker-compose doc中得到了很好的解释:https://docs.docker.com/compose/startup-order/