Golang+SQLite应用Docker部署:容器重启后数据丢失解决方案求助
解决方案
一、本地Docker持久化配置
1. 创建启动脚本
在项目根目录新建entrypoint.sh脚本,负责数据库文件的初始化和挂载:
#!/bin/sh VOLUME_DB="/var/dump/sqlite.db" APP_DB="/go/src/multisig-svc/data/sqlite.db" # 初始化卷中的数据库(首次启动时复制镜像内的初始文件) if [ ! -f "$VOLUME_DB" ]; then cp "$APP_DB" "$VOLUME_DB" fi # 软链接让应用直接读写卷内的数据库文件 ln -sf "$VOLUME_DB" "$APP_DB" # 启动应用 exec ./bin/multisig-svc
2. 更新Dockerfile
修改原Dockerfile,添加脚本执行权限并设置为入口:
FROM golang:1.16.4 ENV GIN_MODE=release ENV PORT=8081 ADD . /go/src/multisig-svc WORKDIR /go/src/multisig-svc RUN go mod download && \ go build -o bin/multisig-svc cmd/main.go && \ chmod +x entrypoint.sh EXPOSE $PORT ENTRYPOINT ["./entrypoint.sh"]
3. 构建并运行容器
# 构建镜像 docker build -t svc . # 运行容器,挂载卷到/var/dump docker run -p 8080:8081 -v data:/var/dump -it svc
首次启动时,卷data中无数据库文件,脚本会自动将镜像内的初始sqlite.db复制到卷中;后续容器重启时,直接使用卷内已有的数据库文件,实现数据持久化。
二、GCP部署适配
Cloud Run场景
Cloud Run的本地文件系统是临时的,容器重启后会重置,因此需要使用外部持久化存储:
- 方案1:改用Cloud SQL:将SQLite替换为Cloud SQL(PostgreSQL/MySQL),这是GCP推荐的持久化数据库方案,避免文件存储的锁和性能问题。
- 方案2:使用Cloud Storage + Cloud FUSE:通过Cloud FUSE将Cloud Storage bucket挂载到容器的
/var/dump目录,让应用直接读写bucket中的sqlite.db文件。需要在Cloud Run服务配置中启用Cloud FUSE并关联目标bucket。
GKE(Kubernetes Engine)场景
如果使用GKE,可以创建Persistent Volume Claim(PVC),将其挂载到容器的/var/dump目录,配置方式类似本地Docker卷,确保Pod重启后数据保留在PVC中。
内容的提问来源于stack exchange,提问作者Umar Farooq
相关产品推荐
相关产品推荐

