You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在docker-compose中自动从PostgreSQL备份文件初始化数据库

自动完成PostgreSQL数据库初始化的解决方案

作为Docker新手,你可以利用PostgreSQL官方镜像自带的初始化机制来实现自动恢复备份,不用再手动执行复制和恢复命令,具体步骤如下:

1. 准备初始化脚本与备份文件

首先在你的项目根目录下创建一个db-init文件夹,把你的app_dump.bak备份文件放进去,然后在这个文件夹里创建一个restore.sh脚本,内容如下:

#!/bin/bash
set -e

# 利用容器环境变量执行备份恢复命令,避免硬编码
pg_restore --no-owner --no-privileges -d "$POSTGRES_DB" -U "$POSTGRES_USER" /docker-entrypoint-initdb.d/app_dump.bak

创建完成后,给脚本添加可执行权限:

chmod +x db-init/restore.sh

2. 修改docker-compose.yml配置

更新你的docker-compose.yml,给dbpostgresql服务添加挂载卷,把本地的初始化目录映射到容器的指定路径,同时建议添加数据持久化卷避免重复初始化:

version: "3"
services:
  app:
    image: 'first-docker-image:latest'
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: app
    depends_on:
      - dbpostgresql
    ports:
      - 8080:8080
    # 补充Spring数据库连接配置,确保能访问容器内的PostgreSQL
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://dbpostgresql:5432/app_db
      - SPRING_DATASOURCE_USERNAME=appuser
      - SPRING_DATASOURCE_PASSWORD=admin
  dbpostgresql:
    image: postgres:12.9
    container_name: dbpostgresql
    environment:
      - POSTGRES_USER=appuser
      - POSTGRES_PASSWORD=admin
      - POSTGRES_DB=app_db
    ports:
      - 5432:5432
    volumes:
      # 挂载初始化脚本与备份文件目录,容器会自动执行其中的脚本
      - ./db-init:/docker-entrypoint-initdb.d
      # 添加数据持久化卷,避免容器重启后重新初始化数据库
      - postgres_data:/var/lib/postgresql/data

# 定义全局数据卷,用于持久化PostgreSQL数据
volumes:
  postgres_data:

3. 关键说明与验证

  • 初始化逻辑:PostgreSQL官方镜像会在容器第一次启动(且数据卷为空)时,自动执行/docker-entrypoint-initdb.d/目录下的.sh、.sql等脚本,所以你的备份恢复只会执行一次,后续重启容器不会重复操作。
  • 容器网络访问:Spring应用的数据库URL使用容器服务名dbpostgresql作为主机名即可,Docker Compose会自动创建内部网络,容器之间可以通过服务名互相访问。
  • 验证操作:运行docker-compose up -d后,你可以通过docker logs dbpostgresql查看容器日志,找到类似"restore completed successfully"的信息,就说明备份已经自动恢复完成,此时API就能正常返回结果了。

内容的提问来源于stack exchange,提问作者user9131524

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 22:47:46