Docker Compose部署PostgreSQL14单实例多租户库及restart配置
单PostgreSQL实例多库部署配置修改方案
官方PostgreSQL镜像默认仅会创建POSTGRES_DB环境变量指定的单个数据库,要在单实例内初始化多个逻辑库,可以利用镜像自带的初始化脚本机制:容器首次启动、完成基础用户和默认库创建后,会自动执行/docker-entrypoint-initdb.d/目录下的所有.sh、.sql格式文件。
修改后的docker-compose.yml
version: '2.1' services: postgres: image: postgres ports: # 对外映射宿主机5432端口到容器内PostgreSQL默认监听端口 - "5432:5432" restart: always environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres # 初始化时默认创建第一个库tenant_master POSTGRES_DB: tenant_master volumes: # 挂载自定义初始化脚本,自动创建剩余两个业务库 - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh healthcheck: # 健康检查调整为校验实例连通性,不绑定单个库 test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 3
配套初始化脚本
在docker-compose.yml同级目录新建init-multi-db.sh文件,写入以下内容:
#!/bin/bash set -e # 实例启动完成后自动创建两个租户库 psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL CREATE DATABASE tenant_1; CREATE DATABASE tenant_2; EOSQL
注意:同一PostgreSQL实例内的多个数据库为逻辑隔离,共用同一个服务监听端口,访问时仅需在客户端连接参数中指定对应库名即可,无需为每个库分配独立端口,完全匹配你要求的三个库统一对外5432端口的需求。
如果你之前已经启动过旧版本的compose生成了数据库数据卷,需要先执行docker-compose down -v删除旧的残留数据卷,再执行docker-compose up -d启动,否则初始化脚本不会触发,剩余两个库不会自动创建。
restart配置项说明
restart: always 详情
- 作用:配置容器的自动重启策略,设置为该值时,容器无论因何种原因退出(包括进程异常崩溃、宿主机重启、Docker服务重启),都会被自动拉起;即使用户手动执行
docker stop停止容器,只要Docker daemon后续重启,容器也会自动启动。 - 使用方法:在服务定义层级与
image、ports等配置同级,直接添加restart: always即可生效。 - 适用场景:生产环境部署的数据库、Web服务、缓存等需要长期稳定运行的业务组件,避免意外退出导致服务中断。
其他可选重启策略
no:默认值,容器退出后无论任何原因都不会自动重启on-failure[:max-retries]:仅当容器以非0状态码(异常退出)时才触发重启,可追加参数指定最大重试次数,超过次数后不再重启;适合执行一次性任务、正常执行完成(退出码0)不需要重启的场景unless-stopped:重启逻辑和always基本一致,核心区别是如果用户手动执行docker stop停止容器,后续Docker服务重启时不会自动拉起该容器;适合开发环境、手动停止后需要保持停止状态的长期运行服务。
内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ
相关产品推荐
相关产品推荐

