Docker容器内数据库迁移不生效 无业务表问题排查
问题根因
从日志输出Migrations file pairs found: 0就能直接定位核心问题:运行中的服务容器内根本不存在迁移脚本文件,扫描不到任何可执行的迁移任务,自然不会创建业务表。
现有配置存在三个明确问题:
- Dockerfile多阶段构建逻辑有遗漏:最终运行阶段的alpine镜像只复制了编译好的
crypto二进制文件,项目下的migrations/迁移脚本目录完全没被打包进镜像,服务启动后扫描对应路径自然找不到任何文件。 - docker-compose.yml中定义的
migrate服务是无效配置:既没有写启动命令,也没有配置数据库连接地址,更没有配置服务依赖关系,执行docker-compose up时这个服务不会执行任何有效迁移操作,就算触发运行也连不上数据库。 - 服务启动时序没做控制:
depends_on默认只等待postgres容器进程启动,不会等待postgres完成初始化、通过健康检查,业务服务可能在数据库还没就绪时就发起连接,导致迁移逻辑执行失败。
修复方案
1. 修正Dockerfile,补全迁移文件复制逻辑
修改Dockerfile,在最终运行阶段把迁移脚本目录同步复制进镜像,和代码里配置的migrations/扫描路径对应:
FROM golang:1.17-alpine as build-stage RUN mkdir -p /app WORKDIR /app COPY . /app RUN go mod download RUN go build -o crypto main.go FROM alpine:latest WORKDIR / COPY --from=build-stage /app/crypto . # 新增以下行,复制迁移脚本目录到镜像内 COPY --from=build-stage /app/migrations ./migrations EXPOSE 9999 ENTRYPOINT [ "/crypto" ]
2. 修正docker-compose.yml配置,补全迁移服务逻辑与时序控制
替换原有compose配置,补全migrate服务的启动命令、连接参数,同时配置服务依赖的健康检查规则,保证启动顺序正确:
version: "3" volumes: crypto_postgres_data: {} services: crypto: build: context: . dockerfile: ./Dockerfile image: crypto_app platform: linux/amd64 env_file: - ./.env depends_on: postgres: condition: service_healthy # 如果使用独立migrate服务就保留这行,代码内置自动迁移就删掉 migrate: condition: service_completed_successfully ports: - "9999:9999" postgres: image: postgres:14.2 healthcheck: test: [ "CMD", "pg_isready", "-U", "$POSTGRES_USER", "-d", "$POSTGRES_DB" ] interval: 10s timeout: 5s retries: 5 start_period: 10s restart: unless-stopped env_file: - ./.env deploy: resources: limits: cpus: '1' memory: 4G volumes: - crypto_postgres_data:/var/lib/postgresql/data:Z # 如果你是在Go代码启动时自动执行迁移,可以直接删掉整个migrate服务 migrate: image: migrate/migrate volumes: - ./migrations:/migrations command: ["-path", "/migrations", "-database", "postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?sslmode=disable", "up"] depends_on: postgres: condition: service_healthy env_file: - ./.env
3. 重新部署验证
执行以下命令清理旧缓存、重新构建启动:
docker-compose down -v docker-compose up --build -d # 查看业务服务日志确认迁移执行 docker-compose logs -f crypto # 保留独立migrate服务的话可以查看迁移日志 docker-compose logs -f migrate
正常启动后日志会显示扫描到对应数量的迁移文件,依次执行迁移逻辑,数据库内可以查到对应的业务表。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

