You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:51:06