postgresql - 持久化 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
(据我所知),该音量对音量进行了匿名化。这会产生不保存任何数据的问题(我创建了一个用户和一个表,然后停止并重新启动了容器,数据就消失了)
有什么想法吗?
解决方案
我经常使用标准的 postgresql docker 镜像,并且在所有情况下我都使用网络套接字连接到正在运行的镜像。
基本上,您有两个选项可以将数据保存在 docker 容器中。
- 将卷容器挂载到数据库
- 将主机路径挂载到您的容器
在开发场景中,我更喜欢第二种解决方案,因为它更透明。
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
推荐阅读
- azure - Azure 表单识别器应用无效的资源名称
- java - 无法在 java 中导入以 org 开头的包(我猜是由于依赖关系)
- database-design - 在数据库中存储选举投票的最佳实践
- c# - apliction.run 在 Visual Studio C# 中是什么意思
- bash - 这种 if 条件有什么问题?
- c# - 不同类型的 Getter 和 Setter 方法
- ios - 更新数组的成员
- kubernetes - 在 Kubernetes 中更新 configmap 时刷新 daemonset pod
- linear-algebra - 机器学习的线性代数
- python - GIL 是否使 Python 解释器单线程或您的 python 代码单线程