2016-07-13 78 views
0

这里我简单的场景,我有一个简单Flask应用程序,连接到一个Postgres是这样的:如何初始化数据卷容器上的数据库?

SQLALCHEMY_DATABASE_URI='postgresql://username:[email protected]: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把这些2操作我的web服务,但因为我的服务和postgres服务有depends_on关系,所以postgres数据库主机在构建阶段不可用。

任何有关实现此目标的最佳方法的建议?我想避免黑客入侵,我宁愿尊重正确的Docker工作流程。

回答

0

一种方式来做到这一点是使用“命令”的文章: https://docs.docker.com/compose/compose-file/#/command (也要看入口点的关键字)

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准备好回答,你可以使用像docker-compose doc中描述的“wait-for-it.sh postgres:5432”这样的脚本:https://docs.docker.com/compose/startup-order/