我在使用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文档中的卷,找不到任何可以告诉我为什么这不起作用的内容。任何人都可以对此有所了解吗?
答案 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