如果docker-compose启动上不存在,则创建postgres数据库

时间:2019-05-20 07:51:46

标签: postgresql docker docker-compose

我有以下docker-compose文件:

version: '3.5'

services:
  postgres:
    container_name: postgres_container
    image: postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
      PGDATA: /data/postgres
    volumes:
       - postgres:/data/postgres
    onrun:
      psql -h=localhost -P=${POSTGRES_PASSWORD} -U=${POSTGRES_USER} -tc "SELECT 1 FROM pg_database WHERE datname = 'premiership'" | grep -q 1 || psql -h=localhost -P=${POSTGRES_PASSWORD}-U=${POSTGRES_USER}c "CREATE DATABASE premiership"
    ports:
      - "5432:5432"
    networks:
      - postgres
    restart: unless-stopped

以上操作不起作用,因为docker-compose服务中没有onrun。

我想做的就是创建一个数据库(如果它不存在),但这非常困难,因为我不知道该服务何时启动。

在postgres中执行此操作也不容易。我尝试映射一个卷,以便运行initdb.sql:

volumes:
   - postgres:/data/postgres
   - ./initdb/1_schema.sql:/docker-entrypoint-initdb.d/1_schema.sql

1_schema.sql看起来像这样:

SELECT datname
FROM pg_database
WHERE datname='premiership'';
    IF datname='
premiership' 
        THEN CREATE DATABASE premiership PASSWORD 'test';
    END IF;

没有创建数据库,运行docker-compose logs时我看不到任何有关运行脚本的信息。

1 个答案:

答案 0 :(得分:2)

您是否尝试过在POSTGRES_DB环境中设置docker-compose.yml变量?

 image: postgres
    environment:
      POSTGRES_USER: ${POSTGRES_USER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
      POSTGRES_DB: premiership
      PGDATA: /data/postgres
    volumes:

请参见https://hub.docker.com/_/postgres

  

POSTGRES_DB

     

此可选环境变量可用于定义其他   首次镜像时创建的默认数据库的名称   开始。如果未指定,则POSTGRES_USER的值将为   被使用。