Docker 转到停靠构建,缓存依赖项拉层
我正在使用Docker 转到停靠构建,缓存依赖项拉层,docker,go,skaffold,Docker,Go,Skaffold,我正在使用skaffold开发一些kubernetes服务,但我的周期中最长的步骤之一是提取容器的所有依赖项 有人建议我如何最好地缓存层中的所有依赖项吗?在docker容器中构建go二进制文件是否有最佳实践?我应该有一个层,在那里我做一个去获取?(我也是一个构建go二进制文件的新手,还不知道所有的细节。)这是go服务的习惯。 因此,所有依赖项都已解析,可执行文件都是在构建阶段构建的。最后一个阶段实际上是运行可执行文件。因此,最终图像的大小将更加纤细。尽管如此,它不会加快依赖项解决阶段。这是go服
skaffold
开发一些kubernetes服务,但我的周期中最长的步骤之一是提取容器的所有依赖项
有人建议我如何最好地缓存层中的所有依赖项吗?在docker容器中构建go二进制文件是否有最佳实践?我应该有一个层,在那里我做一个去获取?(我也是一个构建go二进制文件的新手,还不知道所有的细节。)这是go服务的习惯。
因此,所有依赖项都已解析,可执行文件都是在构建阶段构建的。最后一个阶段实际上是运行可执行文件。因此,最终图像的大小将更加纤细。尽管如此,它不会加快依赖项解决阶段。这是go服务的习惯。
因此,所有依赖项都已解析,可执行文件都是在构建阶段构建的。最后一个阶段实际上是运行可执行文件。因此,最终图像的大小将更加纤细。不过,这不会加快依赖解决阶段。我同意格里戈里·米哈尔金的观点。关于您的性能改进,我想列举一下您所基于的。在撰写本文时,这些工具没有正确的文档记录,但是通过一些尝试和错误,您可能会找到解决方案
使用buildkit,您可以在RUN
语句中使用缓存,以减少后续执行的时间。它们也提供了一个新的解决方案。为了让它正常工作,您必须为Docker守护进程和客户端(在上面的链接中描述)启用实验功能。我同意Grigoriy Mikhalkin的观点。关于您的性能改进,我想列举一下您所基于的。在撰写本文时,这些工具没有正确的文档记录,但是通过一些尝试和错误,您可能会找到解决方案
使用buildkit,您可以在RUN
语句中使用缓存,以减少后续执行的时间。它们也提供了一个新的解决方案。为了让它正常工作,您必须为Docker守护进程和客户端(在上面的链接中描述)启用实验功能。我在谷歌搜索了更多内容后发现了本文,其中介绍了该过程:
技巧的要点是将go.mod
和go.sum
文件复制到容器中,然后运行go mod download
下载依赖项,然后在另一个步骤中继续构建
这是因为除非添加更多依赖项,否则go.mod
和go.sum
文件不会更改。因此,当下一个RUN
语句发生时,即go mod download
docker知道它可以缓存该层。()
我在谷歌上搜索了更多关于过程的文章后发现了这篇文章:
技巧的要点是将go.mod
和go.sum
文件复制到容器中,然后运行go mod download
下载依赖项,然后在另一个步骤中继续构建
这是因为除非添加更多依赖项,否则go.mod
和go.sum
文件不会更改。因此,当下一个RUN
语句发生时,即go mod download
docker知道它可以缓存该层。()
我在将skaffold
与kubebuilder
集成时遇到了完全相同的问题,完全解决此问题的想法是:
安装buildkit,例如:brew安装buildkit
要通过如下方式为本地构建启用skaffold
:
apiVersion:skaffold/v1beta9
种类:配置
建造:
本地:
useBuildkit:正确
乌塞尔利:是的
...
编辑Dockerfile
以启用它:
然后第一次它仍然会下载每个依赖项,但之后它会使用缓存,这大大加快了构建过程。我在将skaffold
与kubebuilder
集成时遇到了完全相同的问题,彻底解决这个问题的想法是:
安装buildkit,例如:brew安装buildkit
要通过如下方式为本地构建启用skaffold
:
apiVersion:skaffold/v1beta9
种类:配置
建造:
本地:
useBuildkit:正确
乌塞尔利:是的
...
编辑Dockerfile
以启用它:
然后在第一次它仍然会下载每个依赖项,但之后它会使用缓存,这大大加快了构建过程。这可能很有用。你可能想看看ko,一个特定于Go的图像生成器,可以通过其自定义生成器与Skafold一起使用。请参阅,这可能很有用。你可能想看看ko,一个特定于Go的图像生成器,可以通过其自定义生成器与Skafold一起使用。看,我将不得不尝试一下,但这看起来特别像我需要的。我再次考虑了这一点,我认为可能有一些解决方案没有那么成熟。引入buildkit只是为了缓存一些后续安装的依赖项,这有点过头了。有一些变通办法,但对我的口味来说,它们都有点老套。但它可能适合您:-是关于复制和归档依赖项文件夹以供CI使用您可以将其与多阶段构建结合起来,以便将归档等所需的命令添加到另一个映像。那对你来说可能更容易。此外,buildkit目前没有提供任何方法将构建缓存从RUN语句复制到主机。这就是为什么它在CI环境中的使用很棘手的原因。有一种黑客的解决方法,你只需复制整个buildkitd-directoy,并将其作为工件存储在你的CI中:有人发布了一个概念证明(试用)
FROM golang:1.13.9-buster as builder
# Make Build dir
RUN mkdir /build
WORKDIR /build
# Copy golang dependency manifests
COPY go.mod .
COPY go.sum .
# Cache the downloaded dependency in the layer.
RUN go mod download
# add the source code
COPY . .
# Build
RUN go build -o app
# Run
FROM debian:buster-slim
COPY --from=builder /build
WORKDIR /app
CMD ["./app"]
# syntax=docker/dockerfile:experimental
# Build the manager binary
FROM golang:1.12.5 as builder
...
# Build
#RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -a -o manager main.go
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GO111MODULE=on go build -o manager main.go
...