PostgresSQL in Docker 版本更新与数据迁移
技术 Docker Postgres 12

前请提要

由于想要将Gitlab 和Nexus 3 都更新一下,故顺便更新下Postgres。将Postgres 15 更新到Postgres 16。

现状

现在的Postgres 是部署在Docker 中的。数据卷通过Docker 的bind-mount 映射到的宿主机中。
原容器的docker compose file 部分内容如下:

  postgres-15:
    container_name: postgres-15
    image: postgres:15.8
    restart: unless-stopped
    ports:
      - 54322:5432
    networks:
      network-database:
        ipv4_address: 172.19.19.22
        aliases:
          - database-postgres-15
    volumes:
      - ./Postgres/15/data/:/var/lib/postgresql/data/
    env_file:
      - ./env_file/TimeZone.env
      - ./env_file/PostgreSQL.env

更新计划

  1. 直接新建一个docker 容器
    postgres:
      container_name: postgres-16
      image: postgres:16.9
      restart: unless-stopped
      ports:
        - 5432:5432
      networks:
        network-database:
          ipv4_address: 172.19.19.2
          aliases:
            - database-postgres
      volumes:
        - ./Postgres/16/data/:/var/lib/postgresql/data/
      env_file:
        - ./env_file/TimeZone.env
        - ./env_file/PostgreSQL.env
    
  2. 应用程序停机(Gitlab)
  3. 将原容器数据使用pg_dumpall 迁移到新容器中
    docker exec -i -t postgres-16 bash
    pg_dumpall -h 172.19.19.22 -U postgres -W > pg_data_15.dump 
    psql -X -U postgres -W < pg_data_15.dump
    vacuumdb -a -z
    

参考文档

Upgrading a PostgreSQL Cluster
SQL Dump
pg_dumpall
psql
vacuumdb

PostgresSQL in Docker 版本更新与数据迁移
https://halo.persipa.site/2025/mhZFa8yL
作者
Persipa
发布于
更新于
许可