如何在docker-compose up时创建两个PostgreSQL数据库?
解决方案
方法一:单PostgreSQL容器中创建双数据库
PostgreSQL官方镜像会自动执行/docker-entrypoint-initdb.d目录下的SQL脚本,可利用这一特性创建第二个数据库:
创建初始化脚本
在项目根目录新建init-db文件夹,里面创建create-prod-db.sql文件,内容如下:CREATE DATABASE prod_db; GRANT ALL PRIVILEGES ON DATABASE prod_db TO postgres;修改base-compose.yml
给testdb服务添加脚本目录挂载:version: '3.3' networks: shared_network: driver: bridge services: testdb: image: postgres:latest volumes: - postgres_data:/var/lib/postgresql/data - ./init-db:/docker-entrypoint-initdb.d # 新增挂载初始化脚本 environment: - POSTGRES_DB=develop_db - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - "5432:5432" networks: - shared_network volumes: postgres_data:重置现有数据卷(首次配置需要)
因为初始化脚本仅在数据库卷首次创建时执行,需先清理旧卷:docker-compose down -v重新启动服务
执行原有启动命令,容器会自动创建develop_db和prod_db两个数据库。
方法二:启动两个独立的PostgreSQL服务(隔离开发/生产环境)
这种方式让开发和生产数据库完全独立,适合需要不同配置的场景:
重构base-compose.yml
只保留网络和卷的基础配置,移除原testdb服务:version: '3.3' networks: shared_network: driver: bridge volumes: postgres_develop_data: postgres_prod_data:修改docker-compose.yml(开发环境)
添加专属的develop_db服务,并更新应用的依赖:version: '3.3' include: - ./base-compose.yml services: develop_db: image: postgres:latest volumes: - postgres_develop_data:/var/lib/postgresql/data environment: - POSTGRES_DB=develop_db - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - "5432:5432" networks: - shared_network test_develop: container_name: test_develop build: . command: python manage.py runserver 0.0.0.0:7000 ports: - "7000:7000" env_file: - ./environments/.env.develop depends_on: - develop_db networks: - shared_network links: - develop_db修改docker-compose-prod.yml(生产环境)
添加专属的prod_db服务,注意端口避免冲突(这里用5433映射到容器内的5432):version: '3.3' include: - ./base-compose.yml services: prod_db: image: postgres:latest volumes: - postgres_prod_data:/var/lib/postgresql/data environment: - POSTGRES_DB=prod_db - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres ports: - "5433:5432" networks: - shared_network test_production: container_name: test_production build: . command: python manage.py runserver 0.0.0.0:8001 ports: - "8001:8001" env_file: - ./environments/.env.prod depends_on: - prod_db networks: - shared_network links: - prod_db启动两个独立项目
使用-p指定项目名,避免服务名称冲突:docker-compose -f docker-compose.yml -p develop up --build -d docker-compose -f docker-compose-prod.yml -p prod up --build -d
内容的提问来源于stack exchange,提问作者spartan
相关产品推荐
相关产品推荐

