草庐IT

node.js - Docker:最后的 Node Alpine 镜像是否比完整 Node 镜像小?

coder 2023-05-06 原文

我正在运行一个 nodeJS 应用程序集群——它们应该非常小,因为它们作为微服务运行。他们中只有少数需要额外的东西,比如 bcrypt 或 imagemagick - 这不时给我带来一些麻烦。

现在我使用 node:10.13-alpine 作为所有 Dockerfile 的基础镜像来构建我的应用程序。对于其中一些,我需要通过 apk 等添加依赖项。所以这些图像变得更大。这是使用 Alpine 图像的最佳方法,通过添加所需的包(例如 python、gcc ......)而变得更大?还是应该使用完整的图像?

如果我使用 node:10.13,基本图像会大很多,但如果我的理解是正确的,我的应用程序只会添加一个小层,因为使用相同的基本图像。所以最后还是用一张大 Node 图比较好??

最佳答案

Alpine 图像更小,因为其他包使用了大量库,而您的解决方案并未使用这些库。

使用小图片有什么好处?

好处是:更少的内存、更好的性能、安全性和可维护性。

较小的 docker 镜像会减少磁盘所需的大小,但 磁盘空间很便宜

更重要的是它还消耗更少的内存,这在每台服务器上都是有限的。如果您减少服务器上的基本镜像数量,这也会导致您根本需要更少的内存。更少的内存意味着您的交换也更少,因此您可以在将所有基本图像加载到内存中时获得一些性能改进。

另一个特点是,来自 alpine 的基础图像使用较少依赖的库,提高了整体安全性。您可以使用基本 alpine 镜像和仅使用真正需要的 apk 的顶部镜像轻松分离风险。这对整体维护也有好处。

您可以在 https://hub.docker.com/r/library/node/tags/ 上查看, alpine 版本没有漏洞。所有其他镜像版本都存在一些问题,这可能会针对您的解决方案的安全性。

为什么默认仍然是“buildpack-deps”以及为什么你应该使用它们?

当你阅读官方文档到 docker images for node 时:

https://hub.docker.com/_/node/

主要内容是:

  • 你可以使用普通的镜像,因为它是基于“buildpack-deps”的,很多镜像都使用这个
  • Alpine 图像非常小,减少了所需的内存量。尤其是没有其他类型的docker容器安装。

对我来说,这最终意味着,如果您使用其他镜像构建在“buildpack-deps”上,那么您可以在大多数情况下使用普通包。在这种情况下,它可能是更好的解决方案,因为除了“buildpack-deps”之外,您不需要在磁盘和内存中保存“alpine”基础镜像。

结论

如果您的 docker 环境中有“唯一” Alpine 镜像,那么您应该使用“ Alpine ”或者如果“Node ”容器的安全性对您非常重要。

在大多数情况下,基于“buildpack-deps”的“Node ”镜像是合适的,因为您还有其他基于“buildpack-deps”的 docker 容器。

我假设将来会有越来越多的基于“alpine”的包可用,然后你应该使用 node-alpine。

关于node.js - Docker:最后的 Node Alpine 镜像是否比完整 Node 镜像小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53024267/

有关node.js - Docker:最后的 Node Alpine 镜像是否比完整 Node 镜像小?的更多相关文章

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  2. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  3. ruby - 如果它是标点符号,我怎么能从字符串中删除最后一个字符,在 ruby​​ 中? - 2

    啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组

  4. ruby - 变量赋值后的 if 语句 - 有多常见? - 2

    我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby

  5. Ruby - 删除文件中的最后一个字符? - 2

    看起来一定很简单,但我就是想不通。如何使用RubyIO删除文件的最后一个字符?我查看了deletingthelastlineofafile的答案使用Ruby但没有完全理解它,必须有更简单的方法。有什么帮助吗? 最佳答案 有File.truncate:truncate(file_name,integer)→0Truncatesthefilefile_nametobeatmostintegerbyteslong.Notavailableonallplatforms.所以你可以这样说:File.truncate(file_name,Fil

  6. ruby-on-rails - Ruby on Rails 的最后 20% - 2

    我是(相当)一位经验丰富的程序员,但对Ruby和RubyonRails完全陌生。RoR看起来很适合快速工作,特别是用于CRUD操作的自动屏幕生成。它确实能让您快速提高工作效率。问题是最后20%的工作,那时我必须完成我的申请。RoR公约不会妨碍我吗?因为不是每个数据库表都必须对所有用户可用,也不是所有用户都可以编辑所有列和/或所有行,而且View必须适应我网站的外观等。我知道RoR已成功用于现场,但在第一阶段烧毁后,如何在RoR中获得足够的速度以逃避重力。 最佳答案 我认为脚手架无法让您达到80%。脚手架很好,因为它向您展示了Rail

  7. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  8. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  9. arrays - 在一行中选择数组的第一个和最后一个元素 - 2

    我的任务是从数组中选择最高和最低的数字。我想我很清楚我想做什么,但只是努力以正确的格式访问信息以满足通过标准。defhigh_and_low(numbers)array=numbers.split("").map!{|x|x.to_i}array.sort!{|a,b|ba}putsarray[0,-1]end数字可能看起来像"80917234100",要通过,我需要输出"9234"。我正在尝试putsarray.first.last,但一直无法弄明白。 最佳答案 有Array#minmax完全满足您需要的方法:array=[80,

  10. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

随机推荐