Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 转到停靠构建,缓存依赖项拉层_Docker_Go_Skaffold - Fatal编程技术网

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
    ...