保留docker postgres数据量,同时允许本地套接字访问(开发容器)

时间:2018-06-20 05:28:12

标签: postgresql docker

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

我发现 Installing PostgreSQL within a docker container用于允许本地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 (据我所知)哪个使音量消失。这就产生了不保留任何数据的问题(我创建了一个用户和一个表,然后停止并重新启动了容器,数据消失了)

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我经常使用标准的PostgreSQL docker映像,在所有情况下,我都使用网络套接字连接到运行中的映像。

基本上,您有两个选择可将数据持久保存在Docker容器中。

  1. 将卷容器安装到数据库中
  2. 将主机路径安装到您的容器

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

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

启动容器时,请传递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