1、问题出现
在学习数据库数据卷的挂载,这样可以对数据库数据进行备份,下次容器重启可以用以前的数据。
django项目单独一个容器,postgres数据库单独一个容器(直接用官方镜像)。在网上参考别人方案,看到docker镜像里postgres将数据放在该路径下/var/lib/postgresql/data
docker-compose.yml
文件内容如下(省去了不相关的部分):
version: "3"
volumes: # 自定义数据卷,位于宿主机/var/lib/docker/volumes内
db_vol: # 定义数据卷同步数据库容器数据
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: 'password'
POSTGRES_USER: 'postgres'
POSTGRES_DB: 'miniserver'
volumes:
- db_vol:/var/lib/postgresql/data/pgdata #挂载数据库数据
使用docker-compose up启动,出现如下问题
initdb: error: directory "/var/lib/postgresql/data" exists but is not empty. If you want to create a new database system, either remove or empty the directory "/var/lib/postgresql/data" or run initdb with an argument other than "/var/lib/postgresql/data".
2、问题解决
添加PGDATA
参数,并改变数据挂载路径,像我添加了一个任意命名的子文件夹,只要不用/var/lib/postgresql/data
即可。
如果这样仍然报原来的错误或者还是出错,像我就遇到了。。请重新命名docker挂载的数据卷和挂载路径(就是把db_vol名字变了,/var/lib/postgresql/data/pgdata路径也变了),可能之前测试时有错误数据写入之类吧,我也不懂。
version: "3"
volumes:
db_vol:
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: 'password'
POSTGRES_USER: 'postgres'
POSTGRES_DB: 'miniserver'
PGDATA: '/var/lib/postgresql/data/pgdata'
volumes:
- db_vol:/var/lib/postgresql/data/pgdata
#- ./compose/postgres/data:/var/lib/postgresql/data/pgdata #挂载自定义路径的数据卷也可以
3、问题原因
其实找了很久,也不是很明白。因为直接搜错误,内网很少相关的,外网又看不太懂。之后其实是结合了内外网才碰巧弄出来的。
docker部署postgresql时,data目录不生效的问题探究提到:
挂载失败原因是官方镜像默认挂载了这个目录(/var/lib/postgresql/data)。所以解决办法就是,把自己的母机的data目录映射到容器里的其他目录,然后通过设置环境变量 PGDATA 为 容器里的新目录,即可。
官方文档中对PGDATA关键字的解释:没看懂,但感觉跟上面这个博主表达的好像也不是同一个意思。
外网讨论1
外网讨论2,其实也是在1的基础上