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

Docker Compose开发模式下Go API代码更新不生效问题

解决Go API代码同步后未生效的问题

你的判断是对的:代码虽然同步到了容器,但没有重新构建可执行文件,也没有重启应用,所以修改不会生效。以下是两种可行的解决方法:

方法一:通过Docker Compose Watch触发构建和重启

1. 修改API的Dockerfile

在镜像中安装procps(提供pkill命令),用于重启应用:

FROM golang:1.22.5-alpine3.20

# 安装pkill依赖
RUN apk add --no-cache procps

WORKDIR /usr/src/app

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .
RUN go build -v -o /usr/local/bin/app ./

EXPOSE 3000

CMD ["app"]

2. 更新docker-compose.yaml的API服务配置

在develop.watch中增加执行构建和重启的命令,仅当Go文件变化时触发:

API:
  container_name: bjm_api
  build: ./api
  ports:
    - "3000:3000"
  develop:
    watch:
      - action: sync
        path: ./api
        target: /usr/src/app
      - action: exec
        command: go build -v -o /usr/local/bin/app ./ && pkill -SIGTERM app
        trigger: "**/*.go"  # 仅监听Go文件变化
  networks:
    - bjm_net
  volumes:
    - api_data_bjm:/app/logs
  env_file: ./api/.env
  depends_on:
    db:
      condition: service_healthy

原理:代码同步后,自动重新构建可执行文件,然后发送终止信号给旧进程,Docker会根据CMD自动重启新的应用进程。

方法二:使用Go热重载工具(Air)

这种方法更适合开发环境,无需手动触发构建,工具会自动检测代码变化并重启应用。

1. 修改API的Dockerfile

安装Air工具并设置启动命令:

FROM golang:1.22.5-alpine3.20

WORKDIR /usr/src/app

# 安装Air热重载工具
RUN go install github.com/cosmtrek/air@latest

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

EXPOSE 3000

# 用Air启动应用,替代直接运行编译后的二进制文件
CMD ["air"]

2. 配置Air(可选)

在API目录下执行air init生成.air.toml配置文件,可根据需要调整构建输出路径、忽略文件等,示例配置:

root = "."
testdata_dir = "testdata"
tmp_dir = "tmp"

[build]
  args_bin = []
  bin = "/usr/local/bin/app"
  cmd = "go build -o ./tmp/main ."
  delay = 1000
  exclude_dir = ["assets", "tmp", "vendor", "testdata"]
  exclude_file = []
  exclude_regex = ["_test.go"]
  exclude_unchanged = false
  follow_symlink = false
  full_bin = ""
  include_dir = []
  include_ext = ["go", "tpl", "tmpl", "html"]
  kill_delay = "0s"
  log = "build-errors.log"
  send_interrupt = false
  stop_on_error = true

[color]
  app = ""
  build = "yellow"
  main = "magenta"
  runner = "green"
  watcher = "cyan"

[log]
  main_only = false
  time = false

[misc]
  clean_on_exit = false

[screen]
  clear_on_rebuild = false
  keep_scroll = true

3. 保持docker-compose.yaml的watch配置不变

原有的sync配置已经足够,Air会自动检测容器内的代码变化并处理热重载。

验证方法

修改Go代码后,观察终端输出:

  • 方法一会看到构建命令执行和应用重启的日志
  • 方法二会看到Air检测到变化并重新构建启动的日志
    之后测试API接口,修改应该已经生效。

内容的提问来源于stack exchange,提问作者Md. A. A. Apu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:57:38