我一直在努力制作一个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
(据我所知)哪个使音量消失。这就产生了不保留任何数据的问题(我创建了一个用户和一个表,然后停止并重新启动了容器,数据消失了)
有什么想法吗?
答案 0 :(得分:1)
我经常使用标准的PostgreSQL docker映像,在所有情况下,我都使用网络套接字连接到运行中的映像。
基本上,您有两个选择可将数据持久保存在Docker容器中。
在开发场景中,我更喜欢第二种解决方案,因为它更透明。
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