2016-07-13 112 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/