我计划使用 Docker 部署 node.js 应用程序。该应用程序有几个需要node-gyp的依赖项。 Node-gyp 根据交付平台上的编译库构建这些模块(例如 canvas、lwip、qrcode),根据我的经验,这些构建可能高度依赖于操作系统版本和安装的库,并且它们经常会破坏一个简单的npm 安装.
构建我的 Dockerfile 也是如此来自节点:版本正确的做法是什么?这似乎是我迄今为止找到的每个 Docker/Node 教程中展示的方法。但如果我从节点镜像构建,部署容器时会发生什么?如何确保目标主机具有编译 node-gyp 模块所需的库?
我正在寻找的另一种方法是构建 Dockerfile来自 ubuntu:版本。但我认为这意味着将 nodeJS 安装到 Ubuntu 镜像中,整个事情会更大。
还有其他方法可以处理这个问题吗?
如何确保目标主机具有编译 node-gyp 模块所需的库?
目标主机也正在运行 docker。只要依赖项存在于您的映像中,那么您的服务器也拥有它们。如果你问我的话,这就是 docker 的全部意义所在。如果它在本地运行,那么它也在服务器上运行。
我会选择节点高山(FROM node:8-alpine
)对于更小的文件。在我开始研究 Node-gyp 之前,我一直在努力解决它,但现在我什至不明白我怎么会认为这是一个问题。只要添加构建工具RUN apk add python make gcc g++
一切顺利(但这会增加 100-200mb 的大小)。
另外,如果它变得耗时(假设您发现自己时不时地使用 --no-cache 重建图像),那么最好将其分成您自己的基本图像和另一个图像FROM my-base-image:latest
其中包含您经常更改的内容。
当然有一些学习曲线,但我没有发现它那么陡峭。至少如果你以前接触过 docker 的话就不会。
我正在考虑的另一种方法是从 ubuntu:version 构建 Dockerfile。
在使用 docker 之前我只使用过 CentOS,并且我在我的服务器上运行 CentOS。所以我认为运行 CentOS 镜像也是个好主意,但我发现这很愚蠢。除非您需要特定于操作系统的东西,否则增益绝对为零。现在我只使用 alpine 大概半年了,到目前为止我唯一需要学习的 alpine 特定命令是apk add/del
.
你可能已经知道了,但一开始不要花太多时间优化 docker 文件大小。 (您可以通过在一行上组合命令(添加包、运行命令、删除包)来大幅减少层大小。但是,如果您在大层中进行任何小的更改,这会取消使用 docker 映像缓存。最好离开直到事情变得重要为止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)