首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

两个奇技淫巧,将 Docker 镜像体积减小 99%

02 多阶段构建 要想大幅度减少镜像的体积,多阶段构建是必不可少的。多阶段构建的想法很简单:“我不想在最终的镜像中包含一堆 C 或 Go 编译器和整个编译工具链,我只要一个编译好的可执行文件!”...你可能还听说过 Alpine 镜像,不要用它!至少暂时不要用,后面我会告诉你有哪些坑。 COPY --from 使用绝对路径 从上一个构建阶段拷贝文件时,使用的路径是相对于上一阶段的根目录的。.../hello"],这样 Docker 就会直接运行程序,不会把它放到 shell 中运行。...如果想查看容器中的文件,可以使用 docker cp;如果想查看或调试网络堆栈,可以使用 docker run --net container:,或者使用 nsenter;为了更好地调试容器,Kubernetes...编译完的程序就可以跑在 scratch 镜像中了。 如果使用 alpine 镜像作为基础镜像来编译,得到的可执行文件会更小(< 100kB),下篇文章会详述。

1.3K11
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    基于Dockerfile构建容器镜像的最佳实践

    由此,该文件的只读版本依然存在于只读层,只是被读写层的该文件副本所隐藏,该机制则被称之为写时复制 3.1.3 UnionFS 把多个目录(也叫分支)内容联合挂载到同一个目录下,而目录的物理位置是分开的...构建上下文build context,“上下文” 意为和现在这个工作相关的周围环境 docker build时当前的工作目录,不管构建时有没有用到当前目录下的某些文件及目录,默认情况下这个上下文中的文件及目录都会作为构建上下文内容发送给...Docker Daemon 当docker build开始执行时,控制台会输出Sending build context to Docker daemon xxxMB,这就表示将当前工作目录下的文件及目录都作为了构建上下文...前面提到可以在RUN指令中添加--no-cache不使用缓存,同样也可以在执行docker build命令时添加该指令以在镜像构建时不使用缓存 构建上下文中,使用.dockerignore 文件在构建时就可以避免将本地模块以及调试日志被拷贝进入到...,“僵尸进程”是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致),但在操作系统的进程表中仍然存在其进程控制块,处于"终止状态"的进程。

    2K40

    Docker容器镜像体积缩小技巧

    最佳实践补充 (1) 建立一个空白目录进行构建上下文准备,切记不要在家里录下创建一个 Dockerfile 紧接着 docker build 一把梭 # 正确做法是为项目建立一个文件夹,把构建镜像时所需要的资源放在这个文件夹下...(7) 最小化层数至docker 在 1.10 以后,只有 RUN、COPY 和 ADD 指令会创建层,其他指令会创建临时的中间镜像但是不会直接增加构建的镜像大小了; # 如果多个文件需要添加到容器中不同的路径...答:要想大幅度减少镜像的体积,多阶段构建是必不可少的。 多阶段构建的想法很简单: “我不想在最终的镜像中包含一堆 C 或 Go 编译器和整个编译工具链,我只要一个编译好的可执行文件!...-static 编译完的可执行文件大小为 760 kB相比于之前的 16kB 是大了好多,这是因为可执行文件中包含了其运行所需要的库文件,编译完的程序就可以跑在 scratch 镜像中了。...你可以选择将 ldd 列出的所有库文件拷贝到镜像中但这会很难维护,特别是当程序有大量依赖库时(不切实际了不建议使用); 对于 hello world 程序来说,拷贝库文件完全没有问题,但对于更复杂的程序

    2.5K31

    使用 docker 轻松部署你的 Go 项目

    /app# 所有后续操作都会在这个目录下进行WORKDIR /app# 将当前项目目录的所有文件拷贝到容器的 /app 目录中COPY . .# 设置 Go 模块代理为 https://goproxy.cn...(在中国加速模块下载),并下载项目的依赖RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod download# 编译 Go 项目,生成可执行文件...FROM alpine:latest# 安装 tzdata 包,确保支持时区的配置RUN apk add --no-cache tzdata# 设置工作目录为 /appWORKDIR /app# 从编译阶段的镜像中拷贝编译后的二进制文件到运行镜像中...表示当前目录,Docker 引擎会从当前目录读取 Dockerfile 以及所有相关的项目文件并打包进镜像中。...在 simple-web-app 项目的根目录下创建 script 目录,并在其中新建 mongo-init.sh 文件,将以下内容添加到该文件中:mongosh -- "$MONGO_INITDB_DATABASE

    1.3K12

    创建自己的Docker基础镜像

    FROM scratch ADD hello / CMD ["/hello"] 注意因为Docker是基于Linux的虚拟机,所以二进制应该是在Linux可运行的,作者在Mac下编译了一个简单的c程序...Docker中的容器运行在操作系统中,共享了操作系统的内核。对于在Mac、Windows平台下,则是基于Linux虚拟机的内核。...Docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是上文说到的UnionFS。在Docker镜像的最底层是bootfs。...创建 Linux 镜像:alpine 目前比较流行的 rootfs 应该就是 alpine 了,因为他的体积特别小,最简单的环境只需要 5M ,下面是他的目录结构,下载地址在 这里。 ?...依赖的镜像可以是本地的,也可以是远程库的 ADD 指的是添加本地文件到镜像中,如果遇到linux可解压格式文件,会自动解压,这就是为什么整个文件中没有对tar.gz进行显式解压 RUN 运行命令,如安装软件的相关命令

    2.8K20

    优化Docker镜像,加速应用部署,教你6个小窍门

    :ruby:2-alpine等 Go/可执行文件 - 直接基于alpine镜像,把编译后的可执行文件打入镜像。...静态页面 - nginx:1-alpine等 2、保证Dockerfile中的清理命令在同一行,也可以减小镜像体积。...Docker在build镜像的时候,如果某个命令相关的内容没有变化,会使用上一次缓存(cache)的文件层,在上传到镜像仓库时,这一层也就不需要上传了。...持久化数据,文件等需要存储到SDS,FDS等后端存储服务中 2、应用日志不能写到本地文件,需要写到标准输出或者标准错误,平台负责收集、汇总和后续的各种处理。...希望以上几点建议能够帮助大家避免或解决实际使用中的问题,让新版应用引擎为更多用户的应用管理提供强有力的支撑。

    1.4K10

    Docker折腾记: (1)构建yapi容器,从构建发布到可用

    提示我们没有权限,为什么会有这个问题, docker hub的提交规范需要我们用自己用户名开头,改一下即可 版本一的镜像体积 ? 版本二的镜像体积 ?...这个字段的值 密码: ymfe.org -----而可能发生的错误,就是npm挂了------ 在初始化的时候,执行 docker logs --details 容器ID 查看内部终端的执行过程,npm...// 若是有node_modules目录, // 我们都应该先干掉node_modules // 这样重新安装依赖才会比较干净 // 进到vendors目录, 比如设置回官方源 npm config...set registry https://registry.npmjs.org/; // 安装全局升级工具和依赖编译的npm模块 npm i -g node-gyp yapi-cli \ npm i...在docker中,容器名默认映射容器的访问ip,所以config.json必须指定为mongo的容器名(这个坑浪费了贼多的时间,国外的社区都搜罗了一遍,基本都是说什么--network这些) 还有一些错误忘记截图收录了

    2.3K30

    手把手带你将 Docker Image 体积减少 90%

    Dockerfile: FROM node # 工作目录 WORKDIR /usr/src/app # 拷贝所需文件 COPY package.json index.js ./ # 安装依赖 RUN...四、正式环境下,不需要安装 devDependencies 的依赖 通常一个项目会安装一些 devDependencies 的依赖,但这些依赖只需要在开发环境中辅助使用,在正式环境下并没有安装的必要。...六、采用多阶段构建 Docker Image 你可以理解为很多层互相叠加在一起,从Docker 1.10开始,COPY、ADD 和 RUN 语句会向镜像中添加新层;而在 Docker 的世界中可以允许有多个...Docker的层用于保存镜像的上一版本和当前版本之间的差异。就像Git的提交一样,如果你与其他存储库或镜像共享它们,就会很方便。...在了解上面的概念后,我们就可以把「安装编译」的步骤放在第一个「FROM」里面执行,然后第二个 FROM 就只是单纯地把第一层的结果搬过去即可,那么 Dockerfile 实现会长这样: FROM alpine

    29810

    前端开发需要掌握的 Docker 知识

    有的人谁说,前端部署很简单的啊,就是把编译后的静态文件,直接丢到一个 Nginx 映射的目录里就行了。那么不用 Docker。...这个命令执行时会默认去寻找当前目录的 Dockerfile 文件,根据其中的编写的内容进行构建镜像 这个过程会将当前目录所有文件上传到镜像中,作为上下文,所以说 要构建的时候千万不要把 node_module...定义工作目录,没有目录会自动创建 RUN 在 docker build 执行命令 如 npm install npm build CMD 在 docker run 时运行执行命令 此外还有一些相比不常用的命令...ADD 可以自动解压 压缩文件到指定目录 ENTRYPOINT 作用与 CMD 相似,都是在指定容器启动程序及参数 ENV 设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量...在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。 作用 避免重要的数据,因容器重启而丢失,这是非常致命的。 避免容器不断变大。

    1K20

    如何在容器时代高效使用 Nginx 三方模块

    在《Nginx 模块系统:前篇》中,我提到过 Nginx 动态模块的来龙去脉,不了解的同学可以自行补习下前置内容。 在聊如何高效使用前,首先需要知道如何高效的“制作”这些模块。...基于容器环境进行实战 在 使用 Docker 和 Nginx 打造高性能二维码服务(二) 一文中,我提到过: “之前构建服务的时候,采用的是使用通用基础镜像编译 Nginx 和它的“小伙伴”(模块),在三年后的今天...编写使用预编译模块的容器文件 在《从封装 Nginx NJS 工具镜像聊起》一文中,我曾提到过如何使用二阶段构建保存动态模块和它的依赖。...config 文件,添加动态模块编译依赖,以及调整编译使用的目标脚本即可。...本篇文章中,我们了解了 Nginx 模块的通用构建方式、容器环境下相对通用的 Nginx 模块构建文件、如何快速使用预编译的三方模块制作定制的 Nginx 服务、以及针对这种积木模式产生的服务进行了简单的性能测试和对比

    60250

    构建更好的Docker镜像的一些技巧

    因此,在国内构建Docker镜像,在Dockerfile文件中,主动加上国内源的设置吧....比如以上面的Java服务为便,利用多阶段构建你可以做成这样 阶段一: 编译项目,这个过程会下载依赖 阶段二: 构建真正的镜像 这样不同阶段的好处在于, 如果你的依赖定义文件没有发生变更的前提下, 阶段一的构建...这样就解决了前面的问题. 善用.dockerignore文件 如果你构建Docker镜像,都从来没有定义,甚至不知道.dockerignore的存在, 那就不应该了....在构建Docker镜像的过程中, Docker会先将本地的一个目录加载到Context上下文中,你才能COPY等....但是项目中的很多目录,比如java中的build目录, npm中的node_modules其实并不需要加载到Context中, 因为我们会在构建过程中重新编译生成这些目录或文件.

    25720

    如何在容器时代高效使用 Nginx 三方模块

    在《Nginx 模块系统:前篇》中,我提到过 Nginx 动态模块的来龙去脉,不了解的同学可以自行补习下前置内容。 在聊如何高效使用前,首先需要知道如何高效的“制作”这些模块。...基于容器环境进行实战 在 使用 Docker 和 Nginx 打造高性能二维码服务(二) 一文中,我提到过: “之前构建服务的时候,采用的是使用通用基础镜像编译 Nginx 和它的“小伙伴”(模块),在三年后的今天...编写使用预编译模块的容器文件 在《从封装 Nginx NJS 工具镜像聊起》一文中,我曾提到过如何使用二阶段构建保存动态模块和它的依赖。...config 文件,添加动态模块编译依赖,以及调整编译使用的目标脚本即可。...本篇文章中,我们了解了 Nginx 模块的通用构建方式、容器环境下相对通用的 Nginx 模块构建文件、如何快速使用预编译的三方模块制作定制的 Nginx 服务、以及针对这种积木模式产生的服务进行了简单的性能测试和对比

    1.1K00

    如何缩小您的docker 镜像体积

    事实证明,在 Docker 中也可以使用多阶段构建达到类似的目的。 在这个示例中,你将构建一个 Node.js 容器。...你可能会注意到差异,特别是当你处理预编译的二进制文件(如 Node.js C++ 扩展)时。 例如,PhantomJS 的预构建包就不能在 Alpine 上运行。...build 时,如果没有新增依赖,docker将使用缓存中的node_modules,这样就减少了部署的时间。...默认的context包含 Dockerfile 目录中的所有文件,但是实际上,我们并不需要.git 目录,node_modules 目录等内容。....dockerignore 的作用和语法类似于 .gitignore,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少 Docker 镜像的大小。

    2.3K20

    Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker

    本文旨在深入浅出地探讨Go语言在云原生开发中的应用,特别是与Kubernetes和Docker的结合,同时指出开发者常遇问题、易错点及规避策略,并辅以代码示例。 1....Go语言因其出色的性能和跨平台编译能力,成为编写Dockerfile和构建Docker镜像的理想选择。...避免:使用多阶段构建,仅复制必要的文件到最终镜像中。 2.2 Kubernetes资源定义 问题:YAML配置错误。 避免:使用Go的client-go库动态生成配置,减少手动编写YAML的错误。...# 设置工作目录 WORKDIR /app # 将Go模块文件复制到镜像中 COPY go.mod go.sum ./ # 下载依赖 RUN go mod download # 复制项目源码...结语 Go语言在云原生领域扮演着核心角色,不仅支撑着Kubernetes这样的重量级项目,也为开发者提供了强大的工具集来构建、部署和管理云原生应用。

    77510

    【Golang】CGO项目Docker镜像打包优化指南,来点新鲜不一样的多阶段构建

    找到了问题就好解决了,于是在alpine系统中,将C的代码重新编译后,打出alpine的so,后面直接将so放入alpine镜像中就可以了。...# 多阶段构建 #构建一个 builder 镜像,目的是在其中编译出可执行文件 #构建时需要将此文件放到代码根目录下 FROM golang:alpine as builder ENV GOOS=linux.../cmd/mck/main.go #编译 FROM alpine RUN apk update --no-cache && apk add --no-cache tzdata #设置本地时区,这样我们在日志里看到的是北京时间了...通过多阶段构建,我们可以有效地减少最终镜像的大小,同时提高构建速度。 在构建过程中,利用Docker的缓存机制,可以将依赖项的下载和编译过程进行缓存,避免重复操作。...通过将C语言的动态库直接复制到最终镜像中,确保应用能够正常运行,避免因缺少依赖而导致的运行时错误。 此外,定期清理无用的dangling镜像,保持Docker环境的整洁避免磁盘空间被占满。

    13310

    Dockerfile的一些用法和最佳实践记录

    COPY 和 ADD 命令的区别 COPY 和 ADD 都是 Dockerfile 的指令,都可以将文件或目录从主机复制到 docker 镜像中。...但是,它们之间存在一些区别: 功能: COPY 指令将从构建上下文中复制新的文件或目录,并将它们添加到镜像的文件系统中指定的路径。 ADD 指令也有类似的功能,但是它还有两个额外的功能。...多阶段构建的优点主要有两个:一是可以避免最终生产的Docker镜像变得过大;二是可以避免在构建过程中在镜像中留下不必要的工具和依赖。...然后,开始第二个构建阶段,它从较小的alpine:latest镜像开始,并从builder阶段复制编译好的Go应用程序到新镜像中。...这样,最终得到的镜像中只包含了编译好的Go应用程序,而没有包含用于编译的Go编译器等额外的工具和依赖,使得镜像更加轻量化。

    23610

    Dockerfile 与 Compose 环境搭建学习笔记(二)

    在选择基础镜像方面,推荐使用 Alpine ,然后再它上面进行定制,因为它非常的小仅3M。我的 Nginx/Redis 是在 Alpine 基础上定制的,PHP 是在 CentOS7上面进行的定制。...这个选项,设置的对应目录中可以找到 Dockerfile 这个文件,当我们 docker-compose up 时,docker会根据这个文件去先创建镜像,然后启动一个容器。...在 redis/ 目录下执行上面的命令,他会先获取基础镜像,然后根据命令逐条执行,完成redis的编译、安装以及相关清理工作。...当然还有 PHP/Nginx 的镜像定制,以及每个服务的配置,大家可以在github上查看详情,这里就不再赘述了,剩下再介绍下这个过程中遇的到的几个错误。 遇到的错误 1....因此当访问静态文件时,Nginx直接在自己的容器中完成操作,而访问php文件时信息传到了PHP所在的容器,容器内部无法找到对应的php文件而导致的错误。

    98320

    Docker镜像优化:从1.16GB到22.4MB

    Docker 是一个供软件开发人员和系统管理员使用容器构建、运行和与分享应用程序的平台。容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 docker 镜像构建的。...镜像中包含运行应用程序所需的一切(编译后的代码、依赖项、库等等)。镜像使用 Dockerfile 文件定义。...图 4:经过第一步优化后镜像大小为 330MB 第二步优化:多阶段构建 通过多阶段构建,我们可以在 Dockerfile 中使用多个基础镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样我们就可以丢弃不需要的东西...在本例中,我们部署 React 应用程序需要的是编译后的代码,我们不需要源文件,也不需要 node_modules 目录和 package.json 文件等。...然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳选择,最好的选择是使用像 Nginx 或 Apache 这样的服务。

    75230

    Docker镜像优化:从1.16GB到22.4MB!

    容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统是使用 docker 镜像构建的。镜像中包含运行应用程序所需的一切(编译后的代码、依赖项、库等等)。...图 4:经过第一步优化后镜像大小为 330MB 第二步优化:多阶段构建 通过多阶段构建,我们可以在 Dockerfile 中使用多个基础镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样我们就可以丢弃不需要的东西...在本例中,我们部署 React 应用程序需要的是编译后的代码,我们不需要源文件,也不需要 node_modules 目录和 package.json 文件等。...图 5:第二步优化后的镜像大小为 91.5MB 现在我们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,我们编译项目,在第二个阶段中,我们在 web 服务器上部署应用程序。...然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳选择,最好的选择是使用像 Nginx 或 Apache 这样的服务。

    1.2K20
    领券