如何用Go多模块组织项目并结合Docker Compose部署?
Go单仓库多模块+Docker Compose 本地开发与部署方案
调整项目结构
在现有单仓库内新增共享模块,比如命名为shared,专门存放API和processor的重复代码:
├── api │ ├── Dockerfile │ ├── go.mod │ └── stuff.go ├── docker-compose.yml ├── go.work ├── processor │ ├── Dockerfile │ ├── go.mod │ └── stuff.go └── shared ├── go.mod └── common.go # 抽离的重复业务/工具代码
配置模块依赖
在api/go.mod和processor/go.mod中添加对shared模块的依赖,同时用replace指令指向本地目录,避免必须推送代码才能开发调试:
# api/go.mod module example.com/api go 1.20 require example.com/shared v0.0.0-unpublished replace example.com/shared => ../shared
processor/go.mod做完全相同的修改,仅需把模块名换成example.com/processor即可。
go.work文件保持管理所有模块:
go 1.20 use ./api use ./processor use ./shared
修改Dockerfile适配多模块
原来的Dockerfile以上下文为模块目录,无法访问上层的shared模块,所以调整为以项目根目录为构建上下文,修改后的api/Dockerfile如下:
FROM golang:1.20 WORKDIR /usr/src/app # 先拷贝所有模块的依赖文件 COPY api/go.mod api/go.sum ./api/ COPY processor/go.mod processor/go.sum ./processor/ COPY shared/go.mod shared/go.sum ./shared/ # 下载API模块的依赖 RUN go mod download -C ./api && go mod verify -C ./api # 拷贝整个项目代码 COPY . . # 构建API二进制文件 RUN go build -v -o /usr/local/bin/api ./api CMD [ "api" ]
processor/Dockerfile只需把最后构建的路径改成./processor,输出二进制名为processor即可。
调整Docker Compose配置
将服务的构建上下文改为项目根目录,指定对应模块的Dockerfile路径:
version: '3.8' services: api: build: context: . dockerfile: ./api/Dockerfile ports: - "8080:8080" depends_on: - mysql - rabbitmq # 其他环境变量、网络配置等按需添加 processor: build: context: . dockerfile: ./processor/Dockerfile depends_on: - mysql - rabbitmq # 其他配置按需添加 rabbitmq: image: rabbitmq:3.11-management ports: - "5672:5672" - "15672:15672" mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: app_db ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
本地开发调试
- 直接在项目根目录运行
go run ./api或go run ./processor,修改shared模块的代码会实时生效,无需重新下载依赖 - 需要调试容器化环境时,执行
docker compose up --build即可,构建过程会自动包含最新的shared代码,无需推送至远程仓库
内容的提问来源于stack exchange,提问作者Nobody Special
相关产品推荐
相关产品推荐

