ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

OCI 映像中的多阶段构建

2023-07-16 15:24:20  阅读:70  来源: 互联网

标签:OCI 映像


使用容器映像交付应用程序的主要好处之一是隔离和安全性。此外,它们应该是轻量级的。但是由于像 Ubuntu 这样的大映像的大小,仅映像本身就很容易达到大于 1 GB 的大小。

这不是错的或什么,这只是一种不好的做法。正如预期的那样,它会工作,但问题很少。

  1. 将映像推送到容器注册表需要更长的时间。
  2. 当您尝试在生产过程中拉取它时,也会发生同样的情况,以可能部署在您的 ECS 或 Kubernetes 中。
  3. 更多存储要求。
  4. 由于计算资源有限而导致的可伸缩性问题。
  5. 容器启动时间较慢。
  6. 更大的容器大小,更大的攻击面。

我并不是说来自RedHat或Ubuntu的容器总是有漏洞,它们在被推送之前会经过大量的测试和QA。

我们可以通过删除未使用的包来减小图像的大小。假设我需要JDK编译为字节码,但我不再需要所有这些工具来运行java程序。我可以删除JDK并使用JRE。

还有另一种方法可以更好地构建此过程,即多阶段构建。

在这里,我希望在容器中使用我的go程序。但是我不需要go包来运行go程序,因为它可以编译为二进制文件。

普通码头文件(或容器文件)

FROM docker.io/library/golang:1.20
WORKDIR /usr/src/app
COPY . .
RUN go mod tidy
RUN go build -o backend .
CMD ["./backend"] 

更酷的码头工人文件

FROM docker.io/library/golang:1.20 AS build-env
RUN apt update && apt install -y musl-tools
WORKDIR /app
COPY . /app
RUN go mod tidy && CC=musl-gcc go build -o backend .

FROM alpine
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
WORKDIR /app
COPY --from=build-env /app/backend /app
EXPOSE 8081
ENTRYPOINT ./backend

在较冷的 dockerfile 中,第一阶段用于将源代码编译为二进制文件。第二阶段用于运行二进制文件。我还在安装其他一些程序所需的软件包并删除包管理器的缓存,因为它对二进制文件的执行并不重要。另外,我使用的是Alpine linux映像,与Ubuntu的5 MB相比,它是188 MB。生成的图像大小从 1.18 GB 增加到仅 29.5 MB。

标签:OCI,映像
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有