Postgresql 持久化docker postgres数据卷,同时允许本地套接字访问(开发容器)
我一直在制作一个postgres docker映像,默认情况下,该映像在本地开发中使用信任验证。我对docker并不完全陌生,但绝对不是一个专家 我发现 用于允许本地unix套接字连接,并解释了如何在卷中持久化数据,但我无法将这两个方面放在一起 当我运行Postgresql 持久化docker postgres数据卷,同时允许本地套接字访问(开发容器),postgresql,docker,Postgresql,Docker,我一直在制作一个postgres docker映像,默认情况下,该映像在本地开发中使用信任验证。我对docker并不完全陌生,但绝对不是一个专家 我发现 用于允许本地unix套接字连接,并解释了如何在卷中持久化数据,但我无法将这两个方面放在一起 当我运行$docker run-p 5432:5432-v pgdata:/var/run/postgresql pgtrusted时,我希望命名卷能够持久存在并在本地可访问,但打开新终端并运行psql会导致第一个问题中记录的错误消息 psql:无法连接
$docker run-p 5432:5432-v pgdata:/var/run/postgresql pgtrusted
时,我希望命名卷能够持久存在并在本地可访问,但打开新终端并运行psql
会导致第一个问题中记录的错误消息
psql:无法连接到服务器:没有这样的文件或目录
服务器是否在本地运行并接受
Unix域套接字上的连接“/var/run/postgresql/.s.PGSQL.5432”
当我通过指定卷时,错误消失了
$docker run-p 5432:5432-v/var/run/postgresql:/var/run/postgresql pgtrusted
这(据我所知)命名了该卷。这就产生了不持久化任何数据的问题(我创建了一个用户和一个表,然后停止并重新启动容器,数据就消失了)
有什么想法吗?我经常使用标准的postgresql docker映像,在所有情况下,我都使用网络套接字连接到正在运行的映像 基本上,有两种方法可以将数据持久保存在docker容器中
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
命名卷由docker文件系统管理,因此无法由主机系统直接访问,而主机卷由主机系统管理,因此可以由主机系统访问。真棒,现在就试试吧。你能解释一下-v语法吗?我们这里说的是
装载卷:要从容器装载的卷
正确吗?因此,第一条路径应该存在于主机上,第二条路径存在于容器的fs中?可以工作了,但我仍然必须指定-h localhost。我不知道会引起什么问题,出于任何原因,本地unix套接字连接是更好的做法吗?@VincentBuscarello'-v'是告诉docker将本地路径装载为volume@VincentBuscarello如果您使用postgres容器,那么您也可以使用包含psql的容器,在这种情况下,我有一个特殊的shell脚本来打开psql。见编辑后的答案