我有以下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
时我看不到任何有关运行脚本的信息。
答案 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
的值将为 被使用。