用于运行nodejs应用程序的两种Dockerfiles之间的区别

我试图运行一个nodejs应用程序作为docker的容器。 我想知道以下两个Dockerfile片段的性能或映像大小是否有所不同

From ubuntu:14.04 RUN apt-get install -y nodejs npm 

 FROM node:4.4.7 

(假设安装的节点版本是相同的)我的理解是,第一个将拉入Ubuntu的图像和安装节点的顶部。 我不确定第二种情况会发生什么。 这是否会根据本地操作系统而有所不同?

hub.docker.com上的节点包包含它们的Dockerfile。 它基于Debian Jessie环境,并从其他图像中提取多个构build工具:

 FROM buildpack-deps:jessie # gpg keys listed at https://github.com/nodejs/node RUN set -ex \ && for key in \ 9554F04D7259F04124DE6B476D5A82AC7E37093B \ 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ FD3A5288F042B6850C66B31F09FE44734EB7990E \ 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ B9AE9905FFD7803F25714661B63B535A4C206CA9 \ C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ ; do \ gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ done ENV NPM_CONFIG_LOGLEVEL info ENV NODE_VERSION 6.2.2 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt CMD [ "node" ] 

您始终可以查看有问题的图像的docker history ,以查看有关它的起源的更多详细信息,但是这并不提供有关从映像中添加和复制内容的详细信息,这通常是如何创build基本映像的:

 $ docker history node:latest IMAGE CREATED CREATED BY SIZE COMMENT a6b9ffdcf522 5 weeks ago /bin/sh -c #(nop) CMD ["node"] 0 B <missing> 5 weeks ago /bin/sh -c curl -SLO "https://nodejs.org/dist 41.51 MB <missing> 5 weeks ago /bin/sh -c #(nop) ENV NODE_VERSION=6.2.0 0 B <missing> 5 weeks ago /bin/sh -c #(nop) ENV NPM_CONFIG_LOGLEVEL=inf 0 B <missing> 5 weeks ago /bin/sh -c set -ex && for key in 9554F0 78.62 kB <missing> 5 weeks ago /bin/sh -c apt-get update && apt-get install 317.9 MB <missing> 5 weeks ago /bin/sh -c apt-get update && apt-get install 122.6 MB <missing> 5 weeks ago /bin/sh -c apt-get update && apt-get install 44.3 MB <missing> 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B <missing> 5 weeks ago /bin/sh -c #(nop) ADD file:5d8521419ad6cfb695 125.1 MB 

这两张图片的区别在于第一张,就像你说的那样拉一个ubuntu镜像并安装节点。 第二个假设是具有运行已经安装的节点所需的所有东西的映像。 肯定节点:4.4.7图像使用Ubuntu的图像。 但它的想法是使用特定的图像,你做的每一个特定的任务,在这种方式下图像更轻,下载,如果节点图像改变,你只下载这部分而不是洞ubuntu的形象。 另外,如果你有另一个使用Ubuntu的图像,例如java,grails,python等等,你可以在不改变的情况下维护ubuntu镜像,并为每一项技术提供一个特定的镜像。 拉斯的原因是,所有这些具体的图像不断改进,你不需要改变你的dockerfiles只是拉和使用它。

这不是真的一样。 通过看一下node:4.4.7的Dockerfile 在这里,你可以看到节点映像是基于一个debian jessie映像,其中安装了几个构build包。 在该节点映像中,它从官方站点获取4.4.7 nodejs targz,而使用apt-get则无法获得相同的版本。 这取决于您在系统中添加的节点回购