首页 > 其他分享 >docker镜像优化

docker镜像优化

时间:2024-07-29 11:07:31浏览次数:10  
标签:缓存 RUN package 构建 镜像 docker 优化 Docker

目录

优化原则

(1)使用体积小的Linux镜像,比如使用alpine作为基础镜像;
(2)尽可能的清理无用的缓存文件,比如尽可能把多个RUN指令合并,避免产生多个临时镜像;
(3)修改dockerfile的时候,尽可能把修改的内容放在最后,这样可以充分利用缓存镜像;
(4)使用".dockerignore"忽略构建docker镜像时不需要的文件,从而减小镜像体积;

使用多阶段构建

多阶段构建是一种有效的优化技术,可以在一个Dockerfile中使用多个FROM指令,每个FROM指令都代表一个构建阶段。每个构建阶段都可以从之前的阶段复制所需的文件,并执行特定的构建操作。
使用多阶段构建可以使得最终生成的镜像只包含运行应用程序所必需的文件和依赖,而不包含构建过程中产生的不必要文件和依赖。
以下是一个多阶段构建的示例:

# 构建阶段1
FROM golang:1.17 AS builder
  
WORKDIR /ap
COPY . .
  
# 编译应用程序
RUN go build -o myapp
  
# 构建阶段2
FROM alpine:latest
  
# 复制编译后的应用程序
COPY --from=builder /app/myapp /usr/local/bin/
  
# 设置工作目录
WORKDIR /usr/local/bin
  
# 容器启动时运行的命令
CMD ["myapp"]

在上面的例子中,我们使用两个构建阶段。第一个构建阶段使用Golang基础镜像来编译应用程序,第二个构建阶段使用Alpine Linux基础镜像,仅复制编译后的应用程序,并设置容器启动时的命令

有效使用缓存

当构建 Docker 镜像时,Docker 使用缓存来优化构建过程,避免重复构建不变的层。下面是一个使用缓存机制的例子:
假设有一个简单的 Node.js 项目,其中有一个 package.json 文件和应用代码文件,例如 app.js。为了构建这个项目的 Docker 镜像,可以编写一个 Dockerfile 如下:

# 设置基础镜像
FROM node:14
 
# 设置工作目录
WORKDIR /app
 
# 将 package.json 复制到工作目录
COPY package*.json ./
 
# 运行 npm install 安装依赖
RUN npm install
 
# 将应用代码复制到工作目录
COPY . .
 
# 指定容器启动命令
CMD ["node", "app.js"]

在这个 Dockerfile 中,我们将 package.json 文件复制到容器中,并运行 npm install 命令来安装依赖。接着,复制应用代码到容器,并设置容器的启动命令。
当我们构建这个镜像时,Docker 使用缓存机制来尽可能地重用之前构建过的层。如果 package.json 文件没有改变,Docker 将会重复使用之前的缓存层,只有当 package.json 文件发生变化时才会重新运行 npm install 这个命令。
例如,首次构建镜像时,Docker 会运行 npm install 安装依赖,并创建一个缓存层。在后续构建过程中,如果只有 app.js 文件发生了改变,而 package.json 文件没有变化,Docker 将会重用之前的缓存层,直接复制 app.js 到镜像中,而无需重新安装依赖,从而加快构建速度。
这种缓存机制可以大幅提升构建速度,特别是在开发过程中,当只有部分文件发生变化时,Docker 可以重复使用之前的层而不必重新构建整个镜像。

多层镜像构建优化

多层镜像构建是指在一个Dockerfile中使用多个RUN指令来构建镜像。每个RUN指令会产生一个新的镜像层,而每个镜像层都会占用额外的存储空间。
为了优化多层镜像构建,可以使用&&操作符将多个命令合并成一个RUN指令,避免产生额外的镜像层。同时,在一个RUN指令中执行多个命令可以减少Docker镜像的大小。
例如,将多个apt-get安装命令合并成一个RUN指令:

RUN apt-get update && apt-get install -y \
    package1 \
    package2 \
    package3

这样可以将多个安装命令合并为一个镜像层,减少镜像大小。

标签:缓存,RUN,package,构建,镜像,docker,优化,Docker
From: https://www.cnblogs.com/Unstoppable9527/p/18329652

相关文章

  • Kubernetes 集群中 Pod 使用镜像的批量导出脚本
    目录动机脚本使用实例获取指定命名空间获取所有命名空间生成csv文件动机最近,由于DockerHub镜像的失效,在重新启动Pod时,拉取镜像失败,导致Pod无法正常启动。因此,我需要批量检查集群中有哪些Pod使用了官方的DockerHub镜像,并将这些镜像保存到本地的Harbor仓库中。为此,......
  • 智象大模型2.0革新:文生图功能优化,攻克复杂长文本理解难题
    智象未来(HiDream.ai),作为AIGC领域的一站式生成平台,近日对其文生图功能进行了重大升级,这不仅为文生视频的发展奠定了重要技术壁垒,也展现了公司在图像生成领域的雄心壮志。智象未来(HiDream.ai)对文生图功能的预期非常高,一直以自己的节奏推进,旨在实现更多样化的功能、更逼真的视觉......
  • Node.js 使用淘宝 NPM 镜像
    在中国大陆地区,由于网络问题,直接使用官方的npm仓库可能会遇到速度慢或者连接超时的情况。为了提高下载速度,可以使用国内镜像源,比如淘宝提供的NPM镜像。以下是使用淘宝NPM镜像的方法:1.配置npm镜像源你可以通过设置npm的registry配置来指定使用淘宝NPM镜像......
  • ubuntu系统安装docker
    运行以下命令,更新软件包索引并安装添加Docker仓库所需的前置软件包:sudoaptupdatesudoapt-get-yinstallapt-transport-httpsca-certificatescurlsoftware-properties-common第2步:导入DockerGPG密钥使用以下命令下载并导入Docker阿里云的GPG密钥:curl-f......
  • Centos7下Docker搭建Matomo
    1.docker安装和启动wgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo-O/etc/yum.repos.d/docker-ce.repoyuminstalldocker-ce-ysystemctlstartdockersystemctlenabledockersystemctlstatusdocker2.配置镜像加速器 针对Docker客户端版......
  • 如何优化 Django 自动重载/启动过程?
    我目前正在开发一个非常大的Django项目,其中包含许多文件,更重要的是,还有大量依赖项,包括Torch和Transformers等包。自从安装Torch以来,我注意到自动重新加载功能和整个启动过程使用开发服务器时的过程变得非常慢。现在我需要10-15秒才能测试我的代码,这在开发过程中非......
  • Swagger、Docker、Python-Flask: : https://editor.swagger.io/ 生成服务器 python-fl
    在https://editor.swagger.io/上您可以粘贴一些json/yaml。我正在将此作为JSON进行测试(不要转换为YAML):{"swagger":"2.0","info":{"version":"1.0","title":"OurfirstgeneratedRES......
  • Dev-C++ 的功能与外观优化
    预备安装安装Dev-C++5.11:官方下载:https://sourceforge.net/projects/orwelldevcpp/(若下载缓慢可选择ProblemDownloading->Auto-select)蓝奏云下载:https://wwu.lanzouq.com/iTwwW07r28ni运行安装包即可。更改语言如果界面语言为英文,选择Tools->EnvironmentOptions......
  • Docker安装最新版portainer,无需agent-验证通过
    https://tehub.com/a/cepm8veVzh  Docker安装最新版portainer,无需agent 要安装portainer/portainer-ce,你可以按照以下步骤操作:安装docker如果你尚未安装docker,请参考官方文档安装docker:https://docs.docker.com/engine/install/下载portainer/portainer-ce镜像......
  • 数据统计查询优化
    数据统计查询优化当前项目中存在的问题当前的数据统计模块中,营业额统计、用户统计和订单统计这三个接口的在业务层中的运行流程如下:根据前端传来的起止日期计算期间每一天的日期并存入日期集合。遍历日期集合得到每一天的日期,将该日期处理后再查询数据库中当天满足条件的数据......