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

dag*_*da1 5 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
Run Code Online (Sandbox Code Playgroud)

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

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

在 postgres 中做到这一点也不容易。我尝试映射一个卷以便运行 initdb.sql:

volumes:
   - postgres:/data/postgres
   - ./initdb/1_schema.sql:/docker-entrypoint-initdb.d/1_schema.sql
Run Code Online (Sandbox Code Playgroud)

1_schema.sql 如下所示:

SELECT datname
FROM pg_database
WHERE datname='premiership'';
    IF datname='
premiership' 
        THEN CREATE DATABASE premiership PASSWORD 'test';
    END IF;
Run Code Online (Sandbox Code Playgroud)

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

小智 14

您是否尝试过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:
Run Code Online (Sandbox Code Playgroud)

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

POSTGRES_DB

此可选环境变量可用于为首次启动映像时创建的默认数据库定义不同的名称。如果未指定,则将POSTGRES_USER使用 的值。