Prisma + NestJS 在 Docker Compose 中的最佳实践
踩了好多坑,记录一下,市面上的文档都不怎么好用,所以自己写一篇,希望能帮到大家。
1. 项目结构
Loading...
2. 环境变量配置
- 创建或修改已有的
.env
:
这里非常关键,需要根据实际情况修改,比如数据库用户名、密码、数据库名等。
docker-compose.yml
中会使用到这些环境变量。用于设定 postgres 的连接信息。也将这些配置传递给 api 容器的Dockerfile
。Dockerfile
中会使用到这些环境变量,用于设定 api 的连接信息。scripts/pg_backup.sh
和scripts/pg_restore.sh
中会使用到这些环境变量。packages/api/prisma/schema.prisma
中会使用DATABASE_URL
来连接数据库,它是通过.env -> docker-compose.yml -> Dockerfile
传递给 api 的。packages/api/wait-for-postgres.sh
中会使用到这些环境变量,用于等待 postgres 容器启动。
Loading...
3. Docker 配置
- 创建 packages/api/wait-for-postgres.sh:
Loading...
- nestjs 内的 Dockerfile:
Loading...
- docker-compose.yml:
Loading...
4. 开发流程
- 初始化开发环境:
Loading...
- 修改数据库结构:
2.1 第一次部署生产环境前:
Loading...
2.2 第二次及后续开发,需要修改数据结构:
Loading...
- 开发测试:
Loading...
5. 部署流程
- 首次部署:
按照 2.1 的步骤,完成初次迁移 sql 的生成后,再开始第一次的部署
- 后续部署:
Loading...
6. 数据库管理
- 备份:
Loading...
备份脚本里使用 docker exec ${COMPOSE_PROJECT_NAME}-postgres pg_dump ... -f /backup/${BACKUP_FILE}
,需要确保 /backup
目录在容器内部存在并且挂载到宿主机,不然备份文件会留在容器中,容器销毁后无法拿到。
- 恢复:
Loading...
还原脚本同理。应在 docker-compose.yml
中给 Postgres 容器配置一个 volumes,把 /backup
映射到宿主机实际持久化目录。本文中因篇幅关系,没有写这段,但实际过程中一定需要这么做
Loading...
如果只是临时存储,脚本可能还需要排查定期清理过期备份,避免硬盘占用过多。
7. 最佳实践建议
- 环境变量:
- 使用
.env
,最好在不同环境使用不同的 .env 文件 - 敏感信息不要提交到版本控制
- 数据库迁移:
- 开发环境使用
migrate dev
- 生产环境使用
migrate deploy
- 定期备份生产数据库,并且开发过程中需要通过
migrate dev
来生成迁移文件
- Docker 部署:
- 使用多阶段构建
- 等待数据库就绪
- 使用健康检查
- 使用数据卷持久化
- 开发流程:
- 本地开发使用 docker-compose.override.yml,本文中使用的是开发环境,没有单独给出这个文件,但实际开发过程中需要
- 生产环境使用 docker-compose.prod.yml,与上同理
- 使用 wait-for-postgres.sh 确保服务启动顺序