针对后端项目构建的再次优化
上次构建示例中,后端的构建速度慢到令人冒火
在无数次搜索后,得到下面的一些经验之谈,希望可以帮到人
最开始的构建有很多提示,先升级了下依赖
优化分为 Dockerfile
和 githubpush.yml
两部分
第一次尝试
首先是Dockerfile
FROM --platform=$BUILDPLATFORM golang:alpine as builder
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod tidy
RUN go build -ldflags="-s -w" -o yourAppName main.go
FROM scratch
# 设置固定的项目路径
ENV WORKDIR /app
# 添加应用可执行文件,并设置执行权限
COPY --from=builder /build/yourAppName $WORKDIR/yourAppName
# 添加I18N多语言文件、静态文件、配置文件、模板文件
COPY --from=builder /build/resource $WORKDIR/resource
# 指定暴露端口, 如果有的话
EXPOSE 8808
###############################################################################
# 运行
###############################################################################
WORKDIR $WORKDIR
CMD ["./yourAppName"]
这套组合拳下来,速度已经非常快了,从最初的20分钟左右缩短到了3分钟
接下来再看githubpush.yml
利用githubAPI可以直接加上cache-from
,cache-to
配置,这样下来时间到了2分钟左右
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
cache-from: type=gha
cache-to: type=gha,mode=max
# 所需要的体系结构,可以在 Available platforms 步骤中获取所有的可用架构
platforms: linux/amd64,linux/arm64
# 镜像推送时间
push: true
再次优化发现,可以挂在缓存,将go mod cache 和 go cache 全部缓存下来,方便后面的Dockerfile打包
再次优化
又经过一番搜索,发现可以在构建之前提取之前的缓存并且注入到构建的环境中,下面是一个简短的列子
RUN go env -w GOMODCACHE=/root/.cache/go-mod-cache
RUN --mount=type=cache,target=/root/.cache/go-mod-cache,sharing=locked,id=go-mod-cache \
go mod download
RUN --mount=type=cache,target=/root/.cache/go-mod-cache \
go build -mod=readonly -ldflags="-s -w" -o yourAppName main.go
- name: Go Build Cache for Docker
uses: actions/cache@v4
with:
path: |
go-mod-cache
key: go-cache-multiarch-${{ hashFiles('go.mod') }}
restore-keys: |
go-cache-multiarch-
- name: inject go-build-cache into docker
# v1 was composed of two actions: "inject" and "extract".
# v2 is unified to a single action.
uses: reproducible-containers/buildkit-cache-dance@v3.1.0
with:
cache-map: |
{
"go-mod-cache": {
"target": "/root/.cache/go-mod-cache",
"id": "go-mod-cache"
}
}
skip-extraction: true
总结
一番折腾后时间到了2分钟之内,但是还是跟本地缓存构建区别比较大,大部分时间都在构建和拉缓存上了,并且打包的时候 还会下载go mod 里面的依赖,怀疑可能缓存没有用上,下次有时间再研究
最后放一张构建的时间图,over!