DevOps已成为现代软件开发和交付的关键实践,而Docker作为一种轻量级容器化技术,在DevOps中扮演着重要角色。优化Docker镜像体积是一个关键目标,它不仅可以加快部署速度,还可以减少网络传输开销和存储成本。本文将介绍一些实用方法,帮助您在DevOps中优化Dockerfile,减少镜像体积。
其实对于大一点的公司而言,基本上都会有多个产品线,每个产品线下又会有多个应用,在实践DevOps过程中基于常用的Linux系统能提供一个标准的基础镜像是一个很重要的事,说下公司提供统一的基础镜像作为各应用的基础镜像的重要性和原因:
综上所述,提供统一的基础镜像作为各应用的基础镜像对于公司来说具有重要的意义。它可以提高系统的安全性、稳定性和可维护性,简化部署流程,降低成本,并促进团队之间的合作。
Docker镜像体积直接影响部署的效率和资源利用率。大型镜像可能导致部署时间增加,而且在网络传输中消耗更多带宽。因此,优化镜像体积对于实现高效的DevOps流程至关重要。小镜像具有快速部署的优势,但它们可能需要更多的配置和调试,因此需要在轻量性和功能性之间进行权衡。 下面是我再实践中常用的一些Dockerfile优化策略:
选择合适的基础镜像对于镜像体积至关重要。推荐使用基于Alpine Linux等小型基础镜像,因为它们通常更小、更安全且更高效。避免使用过于庞大的基础镜像,以减少不必要的依赖。但需要考虑维护难易度, 一般前端项目或者重要性不高的应用可以尝试追求更小的镜像体积, 后端项目还是用公司统一的基础镜像比较合适
减少Docker镜像的图层数有助于减少镜像体积。合并多个RUN指令把变化最少的部分放在Dockerfile的前面,这样可以充分利用镜像缓存,以及使用下面介绍的一些开源工具。此外,及时清理不必要的文件和依赖也可以帮助减少图层数和镜像大小。尤其是需要有些公司有海外或者私有化部署的项目时, 你可以搜搜看有多少人提问如何加速海外镜像同步, 主干网的带宽就那么大, 镜像层能复用就复用,同步的时候就能少同步一些资源
同上充分利用Docker镜像是分层的特性,Dockerfile中的每个指令都会创建一个新的镜像层,镜像层可以被复用和缓存。Dockerfile的指令修改或者复制的文件有变化再或者构建镜像时指定的变量不同都会导致对应的镜像层缓存失效,某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效。 比如有些应用是前后端合并在一起的,就可以先阶段一打包构建前端的资源,将前端的dist产出物COPY到阶段二中,再将二阶段构建的后端应用复制到阶段三的运行镜像中,这样每个构建阶段所依赖的东西都不会带入到运行阶段
FROM node:14-alpine as webbuilder
ADD ./web/package* /web/
RUN cd /web \\
&& nrm use local \\
&& npm i \\
&& npm install
COPY ./web/src /web/src
COPY ./web/public /web/public
RUN cd /web \\
&& npm run build
FROM centos7-worker-go1.18 as builder
ADD ./ /
COPY --from=webbuilder /web/build /serverApp/asset/dist
RUN cd /serverApp \\
&& go build -mod=vendor -o serverApp main.go
FROM centos7-common
ENV APPNAME="serverApp" \\
USER_HOME=/home/admin
RUN yum install -y git && yum clean all
COPY --from=builder /serverApp/serverApp /home/admin/serverApp/serverApp
COPY ./*.sh /home/admin/serverApp/
COPY ./hadolint /bin
RUN mkdir -p $USER_HOME/out/$APPNAME/logs
WORKDIR $USER_HOME/$APPNAME
CMD ["./serverApp" ]