如何在数据卷容器上初始化数据库?

时间:2016-07-13 14:27:31

标签: postgresql python-3.x docker flask docker-compose

在我的简单场景中,我有一个简单的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工作流程。

1 个答案:

答案 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/