Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 持久化docker postgres数据卷,同时允许本地套接字访问(开发容器)_Postgresql_Docker - Fatal编程技术网

Postgresql 持久化docker postgres数据卷,同时允许本地套接字访问(开发容器)

Postgresql 持久化docker postgres数据卷,同时允许本地套接字访问(开发容器),postgresql,docker,Postgresql,Docker,我一直在制作一个postgres docker映像,默认情况下,该映像在本地开发中使用信任验证。我对docker并不完全陌生,但绝对不是一个专家 我发现 用于允许本地unix套接字连接,并解释了如何在卷中持久化数据,但我无法将这两个方面放在一起 当我运行$docker run-p 5432:5432-v pgdata:/var/run/postgresql pgtrusted时,我希望命名卷能够持久存在并在本地可访问,但打开新终端并运行psql会导致第一个问题中记录的错误消息 psql:无法连接

我一直在制作一个postgres docker映像,默认情况下,该映像在本地开发中使用信任验证。我对docker并不完全陌生,但绝对不是一个专家

我发现 用于允许本地unix套接字连接,并解释了如何在卷中持久化数据,但我无法将这两个方面放在一起

当我运行
$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 hub上的官方postgresql镜像站点描述了如何实现这一点。

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

    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。见编辑后的答案