首页 > 解决方案 > 持久化 docker postgres 数据量,同时允许本地套接字访问(开发容器)

问题描述

我一直致力于制作一个默认使用信任身份验证进行本地开发的 postgres docker 映像。我对 docker 并不完全陌生,但绝不是专家。

我发现 在 docker 容器中安装 PostgreSQL以允许本地 unix 套接字连接和How to persist data in a dockerized postgres database using volumes解释了如何在卷中持久化数据,但我不能将两者放在一起。

当我运行时,$ docker run -p 5432:5432 -v pgdata:/var/run/postgresql pgtrusted我希望命名卷能够持久存在并且可以在本地访问,但是打开一个新终端并运行psql会导致第一个问题中记录的错误消息

psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

当我指定音量时,错误就消失了 $ docker run -p 5432:5432 -v /var/run/postgresql:/var/run/postgresql pgtrusted (据我所知),该音量对音量进行了匿名化。这会产生不保存任何数据的问题(我创建了一个用户和一个表,然后停止并重新启动了容器,数据就消失了)

有什么想法吗?

标签: postgresqldocker

解决方案


我经常使用标准的 postgresql docker 镜像,并且在所有情况下我都使用网络套接字连接到正在运行的镜像。

基本上,您有两个选项可以将数据保存在 docker 容器中。

  1. 将卷容器挂载到数据库
  2. 将主机路径挂载到您的容器

在开发场景中,我更喜欢第二种解决方案,因为它更透明。

docker hub 上的官方 postgresql 镜像站点描述了如何实现它。 https://hub.docker.com/_/postgres/

当您启动容器时,传递一个 PGDATA 环境变量,该变量指向您想要放置数据库文件的容器内部路径。示例调用如下所示。

docker run -p 5432:5432 -e PGDATA=/opt/postgresql -v \ 
  /FULL_PATH/ON_HOST/pgdata:/opt/postgresql pgtrusted

选择的主机目录需要为空,并且在您的容器消失后,您仍然可以将数据库文件放入其中,并且可以将它们挂载到下一个容器。

如果您使用官方的 postgresql 映像,也可以使用内部 psql 控制台访问您的数据库。以下代码获取容器 ID 并在其中执行 psql。

CONT_ID=`docker ps | grep "${CONTAINER_NAME}" | awk '{print $1}'`

if [ -z "$CONT_ID" ]; then
    echo "can't find running psql container, exit"
    exit 1
fi

docker exec -it "$CONT_ID" psql -U db_user -h localhost desired_db

推荐阅读