如何使用本地Go包构建Docker镜像?
用本地Go包构建Docker镜像的完整方案
没问题,我来帮你搞定这个事儿,咱们一步步来,先理清楚你的本地目录结构,这样后续操作才不会乱:
/gowork/src/ ├── dockerpkgmain/ │ ├── main.go │ └── Dockerfile └── dockerpkg/ └── mult/ └── mult.go
第一步:配置Go模块,搞定本地包依赖
因为你的main.go引用了本地的dockerpkg/mult包,Go默认会去远程仓库找,所以得通过Go模块告诉它这是个本地包:
- 先进入
dockerpkgmain目录:cd /gowork/src/dockerpkgmain - 初始化Go模块(模块名可以随便取,这里就用
dockerpkgmain):go mod init dockerpkgmain - 打开生成的
go.mod文件,添加replace指令,把dockerpkg/mult指向本地的实际路径:module dockerpkgmain go 1.21 # 这里换成你自己使用的Go版本哈 require dockerpkg/mult v0.0.0-00010101000000-000000000000 replace dockerpkg/mult => ../dockerpkg/mult - 执行
go mod tidy同步依赖,这时候会生成go.sum文件,确保本地包能被正确识别:go mod tidy
第二步:写对Dockerfile,推荐用多阶段构建
多阶段构建能让最终的镜像特别小,只留编译好的二进制文件,没有多余的编译环境。在/gowork/src/dockerpkgmain/Dockerfile里写这些内容:
# 第一阶段:用官方Go镜像做编译环境,命名为builder阶段 FROM golang:1.21-alpine AS builder # 设置容器内的工作目录 WORKDIR /app # 先复制go.mod和go.sum,这样能利用Docker的缓存,不用每次都重新拉取依赖 COPY go.mod go.sum ./ # 把本地的dockerpkg/mult包复制到容器内对应的路径 COPY ../dockerpkg/mult ../dockerpkg/mult # 再复制main.go文件 COPY main.go ./ # 编译二进制文件,关闭CGO并指定linux平台,确保在alpine系统上能正常运行 RUN CGO_ENABLED=0 GOOS=linux go build -o myapp main.go # 第二阶段:用轻量的alpine镜像做最终镜像 FROM alpine:latest WORKDIR /root/ # 从builder阶段把编译好的二进制文件复制过来 COPY --from=builder /app/myapp . # 容器启动时执行的命令,这里可以添加你需要的flag参数,比如-f 2 -s 3 CMD ["./myapp", "-f", "2", "-s", "3"]
第三步:构建Docker镜像
在dockerpkgmain目录下执行这条命令,给镜像打个便于识别的标签(比如go-local-pkg-app):
docker build -t go-local-pkg-app .
第四步:运行容器验证效果
执行这条命令启动容器:
docker run go-local-pkg-app
正常情况下你会看到输出:
From different pkg 6
一些小提醒
- 记得Dockerfile里的Go版本要和你本地使用的一致,不然可能会出现编译兼容性问题。
- 如果以后本地包的路径发生变化,要记得更新
go.mod里的replace指令。 - 多阶段构建真的很实用,最终镜像只有几MB大小,比直接用Go镜像当基础镜像高效太多了。
内容的提问来源于stack exchange,提问作者Mzia
相关产品推荐
相关产品推荐

