网站首页 > 资源文章 正文
使用多阶段构建编译
可以使用 golang 的官方镜像进行编译,建议使用静态编译,因为 golang 官方镜像默认使用的基础镜像是 debian,如果使用默认的编译,会依赖依赖一些动态链接库,当业务镜像使用了其它发行版基础镜像,且动态链接库不一样的话 (比如 alpine),就会导致程序启动时发现依赖的动态链接库找不到而无法启动:
standard_init_linux.go:211: exec user process caused "no such file or directory"
以下是多阶段构建静态编译 golang 程序的 Dockerfile 示例:
FROM golang:latest as builder
COPY . /build
WORKDIR /build
RUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w -extldflags=-static' -o /app
FROM ubuntu:22.10
COPY --from=builder /app /
CMD ["/app"]
如果希望最小化镜像,可以用空基础镜像,让镜像中只包含一个静态编译后 go 二进制:
FROM golang:latest as builder
COPY . /build
WORKDIR /build
RUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w -extldflags=-static' -o /app
FROM scratch
COPY --from=builder /app /
CMD ["/app"]
建议 k8s 1.23 及其以上版本使用 scratch 基础镜像,即使镜像中不包含 bash 等调试工具,也可以 使用临时容器来进行调试。
利用 go module 缓存加速构建
如果在固定的机器上编译镜像,可以考虑在 Dockerfile 中为 go modules 缓存单独使用一个阶段构建,具体思路是将项目中的 go.mod 和 go.sum 先单独拷贝过去,然后执行以下 go mod download 来下载 go modules 缓存,只要这两个文件没有变动,下次构建镜像时就可以直接复用之前下载好的 go modules 缓存依赖。
示例:
FROM golang:alpine AS mod
RUN apk add --no-cache git
WORKDIR /workspace
COPY go.mod .
COPY go.sum .
RUN go mod download
FROM mod AS build
COPY . .
RUN CGO_ENABLED=0 go build -o app -ldflags '-w -extldflags "-static"' .
FROM alpine:latest
RUN apk add --no-cache tzdata ca-certificates
COPY --from=build /workspace/app /app
CMD ["/app"]
参考资料
- 使用临时容器来进行调试: https://kubernetes.io/zh-cn/docs/tasks/debug/debug-application/debug-running-pod/#ephemeral-container
猜你喜欢
- 2024-10-14 手机内存不足?不要胡乱清理了,学会了让手机空间瞬间释放!
- 2024-10-14 「GCTT 出品」Golang 中的微服务-第二部分-Docker 和 go-micro
- 2024-10-14 口袋妖怪Go新版本更新分析解读 0.23.1更新内容
- 2024-10-14 Oculus CTO: Quest仍然支持安装第三方APK
- 2024-10-14 Pokemongo虚拟定位教程 Pokemongo电脑版虚拟定位怎么设置?
- 2024-10-14 Pokemon go PC版安装教程 pokemongo电脑版gps模拟器安装
- 2024-10-14 口袋妖怪go手环最新消息 手环功能详解
- 2024-10-14 最简单的Go Dockerfile编写姿势,没有之一
- 2024-10-14 512MB内存都不卡 谷歌亲自为安卓开发手机管家
- 2024-10-14 干货分享:用 Go 从头实现一个迷你 Docker—Gocker
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- 电脑显示器花屏 (79)
- 403 forbidden (65)
- linux怎么查看系统版本 (54)
- 补码运算 (63)
- 缓存服务器 (61)
- 定时重启 (59)
- plsql developer (73)
- 对话框打开时命令无法执行 (61)
- excel数据透视表 (72)
- oracle认证 (56)
- 网页不能复制 (84)
- photoshop外挂滤镜 (58)
- 网页无法复制粘贴 (55)
- vmware workstation 7 1 3 (78)
- jdk 64位下载 (65)
- phpstudy 2013 (66)
- 卡通形象生成 (55)
- psd模板免费下载 (67)
- shift (58)
- localhost打不开 (58)
- 检测代理服务器设置 (55)
- frequency (66)
- indesign教程 (55)
- 运行命令大全 (61)
- ping exe (64)
本文暂时没有评论,来添加一个吧(●'◡'●)