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

如何让基于Dockerfile构建的PostgreSQL容器数据持久化到本地?

如何让PostgreSQL Docker容器停止后数据不丢失?

我编写了用于构建PostgreSQL的Dockerfile,代码如下:

FROM postgres:9.4
MAINTAINER Fabio Ebner
ENV POSTGRES_PASSWORD="dna44100"
ENV POSTGRES_PORT=5432
EXPOSE ${POSTGRES_PORT}
COPY init.sql /docker-entrypoint-initdb.d/

目前每次停止容器后数据库数据都会丢失,请问如何配置才能将数据始终保存到本地主机中?


这问题我之前也踩过坑!核心原因是Docker容器默认使用临时文件系统,容器销毁后内部数据会一并消失。要解决这个,你需要用**Docker卷(Volume)**把容器内PostgreSQL的核心数据目录挂载到本地主机的目录,这样数据就会持久化保存在本地了。

方法一:命令行直接挂载本地目录

PostgreSQL官方镜像默认将数据存储在容器内的/var/lib/postgresql/data路径下。启动容器时通过-v参数把本地目录与这个路径绑定即可:

docker run -d \
  -p 5432:5432 \
  -v /你的本地绝对路径/postgres-data:/var/lib/postgresql/data \
  --name my-postgres-container \
  你构建的镜像名称
  • 把/你的本地绝对路径/postgres-data替换成你实际想存储数据的文件夹(比如/home/fabio/postgres-data)
  • -d让容器在后台运行,-p映射端口,--name给容器起个好记的名字方便后续管理

方法二:用Docker Compose管理(更推荐)

如果平时习惯用Docker Compose编排容器,直接在docker-compose.yml里配置卷会更省心,管理也更清晰:

version: '3'
services:
  postgres:
    build: .  # 基于当前目录的Dockerfile构建镜像
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_PASSWORD=dna44100
      - POSTGRES_PORT=5432
    volumes:
      # 把本地当前目录下的postgres-data文件夹挂载到容器的数据目录
      - ./postgres-data:/var/lib/postgresql/data
      # 也可以在这里挂载初始化脚本,替代Dockerfile里的COPY(可选)
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

配置完成后执行docker-compose up -d启动容器,数据就会自动保存在当前目录的postgres-data文件夹中。

几个关键注意事项

  • 权限问题:PostgreSQL容器内的进程是以postgres用户(UID为999)运行的,所以本地目录需要设置对应权限,否则容器可能无法写入数据。提前执行以下命令:
    mkdir -p /你的本地绝对路径/postgres-data
    chown -R 999:999 /你的本地绝对路径/postgres-data
    
  • 旧容器处理:如果之前已经启动过未挂载卷的容器,需要先停止并删除旧容器,再用挂载卷的方式重新启动,否则旧数据不会自动迁移到新的挂载目录中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:41:57