Docker Compose未创建cucurbit数据库,SpringBoot连接PostgreSQL报错
Docker Compose部署SpringBoot+PostgreSQL数据库不存在问题排查
你的Docker Compose文件存在两个核心问题,导致cucurbit数据库无法正常创建:
1. PostgreSQL服务的command配置错误
PostgreSQL官方镜像的默认启动逻辑会读取POSTGRES_DB、POSTGRES_USER等环境变量,自动完成数据库和用户的初始化。但你自定义的command参数完全覆盖了这个初始化流程,而且命令本身语法错误:
command: postgres -c 'create database cucurbit' dbname=cucurbit
-c是Postgres启动时设置配置参数的选项,不能直接执行SQL语句;dbname=cucurbit也不是合法的启动参数。这个错误命令会导致Postgres跳过自动创建数据库的步骤,直接启动服务,自然不会生成cucurbit数据库。
2. depends_on未保证数据库服务就绪
depends_on: [db]仅能保证cucurbit-db容器先于后端启动,但无法确保PostgreSQL服务完全初始化完成。后端启动时可能数据库还处于启动初始化阶段,此时连接会失败。
修正后的Docker Compose文件
version: '2' services: app: image: 'docker-spring-boot-postgres:latest' build: context: . container_name: cucurbit-backend depends_on: - db environment: - CUCURBIT_ENVIRONMENT_PROFILE=development - CUCURBIT_DATABASE_URL=jdbc:postgresql://cucurbit-db:5432/cucurbit - CUCURBIT_DATASOURCE_USERNAME=postgres - CUCURBIT_DATASOURCE_PASSWORD=password - CUCURBIT_EMAIL_SENDER_USERNAME=noreply.cucurbit@gmail.com - CUCURBIT_EMAIL_SENDER_PASSWORD=wakeuptellme1234. - CUCURBIT_EMAIL_NOTIFICATION_SEND_TO=jobskreya@gmail.com expose: - 8080 ports: - "8080:8080" # 修正端口映射格式,需遵循「本地端口:容器端口」 restart: on-failure # 添加自动重启,应对数据库未就绪的连接失败情况 db: image: 'postgres:13.1-alpine' container_name: cucurbit-db hostname: cucurbit-db expose: - '5432' ports: - "5432:5432" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_DB=cucurbit # 移除错误的command配置,使用镜像默认初始化逻辑 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d cucurbit"] interval: 5s timeout: 5s retries: 5
额外优化说明
- 移除PostgreSQL服务的错误
command配置,让镜像自动处理数据库初始化 - 为后端服务添加
restart: on-failure,在数据库未就绪导致连接失败时自动重启,直到连接成功 - 为PostgreSQL服务添加
healthcheck,精确检测数据库服务是否就绪 - 修正端口映射格式,确保本地端口与容器端口的映射关系正确
内容的提问来源于stack exchange,提问作者CarrotSnip
相关产品推荐
相关产品推荐

