我在标准Docker上为AWS堆栈部署了一个服务(使用这个 template )。 我使用部署 docker stack deploy -c docker-compose.yml pos 使用此撰写文件:
docker stack deploy -c docker-compose.yml pos
version: "3.2" services: postgres_vanilla: image: postgres volumes: - db-data:/var/lib/postgresql volumes: db-data: driver: "cloudstor:aws" driver_opts: size: "6" ebstype: "gp2" backing: "relocatable"
然后,我更改数据库中的一些数据,并使用 docker service update --force pos_postgres_vanilla
docker service update --force pos_postgres_vanilla
问题是我所更改的数据在更新后不会保持不变。 我注意到Postgresinitdb脚本在每次更新时都会运行,所以我假设它是相关的。
我做错什么了吗?
问题是 cloudstor:aws 创建卷时使用 lost+found 在它下面,当Postgres启动时,它会发现数据目录不是空的,并且会抱怨它。要修复此问题,我将卷更改为在数据目录上装入一个目录,位于 /var/lib/postgresql ,但这导致Postgres找不到pgversion文件,从而导致它在每次容器启动时都运行initdb。( https://github.com/docker-library/postgres/blob/master/11/docker-entrypoint.sh#L57 )。
cloudstor:aws
lost+found
/var/lib/postgresql
因此,为了解决这个问题,我没有更改要安装在数据目录上的一个目录中的卷,而是通过覆盖环境变量将数据目录更改为低于卷安装的一个级别。 PGDATA (像是 /var/lib/postgresql/data/db/ )。
PGDATA
/var/lib/postgresql/data/db/