如何让基于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
相关产品推荐
相关产品推荐

