【问题标题】:How to initialize a database on a data volume container?如何在数据卷容器上初始化数据库?
【发布时间】:2016-07-13 14:27:31
【问题描述】:

这是我的简单场景,我有一个简单的Flaskapp,它以这种方式连接到 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

我已将这两个操作放在我的web 服务的Dockerfile 中,但是因为我的服务和postgres 服务有depends_on 关系,所以在构建阶段postgres db 主机不可用。

关于实现这一目标的最佳方法有什么建议吗?我想避免黑客攻击,我更愿意尊重正确的 Docker 工作流程。

【问题讨论】:

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


    【解决方案1】:

    一种方法是使用“command”关键字: 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 准备好回答,您可以使用诸如“wait-for-it.sh postgres:5432”之类的脚本,这些脚本在 docker-compose doc 中有很好的解释:https://docs.docker.com/compose/startup-order/

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 2015-05-22
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      相关资源
      最近更新 更多