PostgreSQL Docker容器未将数据写入磁盘

时间:2019-03-10 21:05:19

标签: postgresql docker

我在使用Docker和来自Docker Hub的postgres映像时遇到了一些困难。我正在开发一个应用程序,并使用postgres docker存储我的开发数据。我正在使用以下命令启动我的容器:

sudo docker run --name  some-postgresql -e POSTGRES_DB=AppDB  -e POSTGRES_PASSWORD=App123! -e POSTGRES_USER=appuser -e PGDATA="/pgdata" --mount source=mydata,target=/home/myuser/pgdata  -p 5432:5432/tcp postgres

当我完成我的应用程序的工作时,通常必须运行“ docker container prune”,以释放容器名称并在以后再次运行。直到最近,当我升级我的postgres映像以运行PostgreSQL版本11时,这种方法才起作用。现在,当我启动容器并在其中创建数据时,下次使用它时,数据将消失。我一直在阅读docker文档中的卷,找不到任何可以告诉我为什么这不起作用的内容。任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分:1)

使用-v $PGDATA_HOST:/var/lib/postgresql/data指定卷安装。

容器内的默认PGDATA为/var/lib/postgresql/data,因此,如果您不修改Docker映像,则无需更改它。

例如将数据目录挂载到主机上的/srv/pgdata/

$ PGDATA_HOST=/srv/pgdata/
$ docker run -d -p 5432:5432 --name=some-postgres \
       -e POSTGRES_PASSWORD=secret                \
       -v $PGDATA_HOST:/var/lib/postgresql/data   \
       postgres

\仅在您将命令分成多行时才需要,为清楚起见,我在这里这样做。

答案 1 :(得分:0)

由于您指定了-e PGDATA="/pgdata",因此数据库数据将被写入容器内的/pgdata。如果您希望/pgdata中的文件在容器删除后仍然有效,则该位置必须是 docker volume 。要使该位置成为docker卷,请使用--mount source=mydata,target=/pgdata

最后,运行起来会更简单:

sudo docker run --name  some-postgresql -e POSTGRES_DB=AppDB  -e POSTGRES_PASSWORD=App123! -e POSTGRES_USER=appuser --mount source=mydata,target=/var/lib/postgresql/data  -p 5432:5432/tcp postgres