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
相关产品推荐
相关产品推荐

