我有以下docker-compose.yml
文件:
# some other services here
......
......
#############################
# Setup PostgreSQL container
#############################
service-postgres:
image: postgres:10-alpine
container_name: service-postgres-server
volumes:
- ./data/postgres:/var/lib/postgresql
- ./docker/initdb:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
environment:
- POSTGRES_PASSWORD=root
- POSTGRES_DB=db_name
每次我尝试重建运行force-recreate的容器时,我都会丢失数据库架构和数据:
docker-compose up -d --force-recreate --build
但当我查看data/postgres
时,我发现文件和设置在那里:
-$ ls data/postgres
PG_VERSION pg_commit_ts pg_ident.conf pg_notify pg_snapshots pg_subtrans pg_wal postgresql.conf
base pg_dynshmem pg_logical pg_replslot pg_stat pg_tblspc pg_xact postmaster.opts
global pg_hba.conf pg_multixact pg_serial pg_stat_tmp pg_twophase postgresql.auto.conf postmaster.pid
每次需要重建系统时,如何解决问题并保留数据库架构和数据。
答案 0 :(得分:3)
为什么数据库数据会丢失?
我尝试了不同的方法,并将MySQL image与PostgreSQL image进行了比较。现在我发现了问题。使用命名卷或已安装卷但没有区别,您必须绑定容器上的correct folder以保留数据库数据:
services:
service-postgres:
image: postgres:10-alpine
container_name: service-postgres-server
volumes:
- ./data/postgres/data:/var/lib/postgresql/data
- ./docker/initdb:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: root
POSTGRES_DB: db_name
您必须将/var/lib/postgresql/data
文件夹绑定到主机而不是/var/lib/postgresql
文件夹。您也可以将这两个文件夹挂载到主机(data
文件夹和postgres
文件夹),但需要data
文件夹保留。在MySQL映像上,您只需要/var/lib/mysql
文件夹即可将数据保存在主机上。
仅供比较:MySQL图片:
services:
service-mysql:
image: mysql:5.7
container_name: service-mysql-server
volumes:
- ./data/mysql-db:/var/lib/mysql
- ./docker/initdb:/docker-entrypoint-initdb.d
ports:
- "3306:3306"
environment:
MYSQL_PASSWORD: root
MYSQL_DATABASE: db_name
通过上述配置,MySQL数据将保留在主机上。
使用指定的卷:
services:
service-postgres:
image: postgres:10-alpine
container_name: service-postgres-server
volumes:
- postgresql-data:/var/lib/postgresql/data
- ./docker/initdb:/docker-entrypoint-initdb.d
ports:
- "5432:5432"
environment:
POSTGRES_PASSWORD: root
POSTGRES_DB: db_name
volumes:
postgresql-data:
使用命名卷,您可以使用docker-compose down -v
将其删除。您无法使用docker-compose down
命令删除已装入的卷。
您可以在docker volume ls
的卷列表中找到该卷。您还可以使用docker volume inspect <volume-name>
检查卷,以获取主机上的挂载点。