我打算使用 Docker 部署 node.js 应用程序。该应用程序有几个需要 node-gyp 的依赖项。 Node-gyp 在交付平台上针对已编译的库构建这些模块(例如 canvas、lwip、qrcode),根据我的经验,这些构建可能高度依赖于 o/s 版本和安装的库,并且它们经常破坏一个简单的 npm 安装。
那么构建我的 Dockerfile FROM node:version 是正确的方法吗?到目前为止,这似乎是我在每个 Docker/Node 教程中展示的方法。但是如果我从 Node 镜像构建,部署容器时会发生什么?如何确保目标主机具有编译 node-gyp 模块所需的库?
我正在寻找的另一种方法是构建 Dockerfile FROM ubuntu:version。但我认为这意味着将 nodeJS 安装到 Ubuntu 镜像中,整个东西会大得多。
还有其他处理方法吗?
最佳答案
How can I ensure the target host will have the libraries needed to compile the node-gyp modules?
目标主机也正在运行 docker。只要依赖项在您的镜像中,那么您的服务器也会有它们。如果你问我,这就是 docker 的全部意义所在。如果它在本地运行,那么它也会在服务器上运行。
对于更小的文件,我会使用 node-alpine(FROM node:8-alpine
)。在我全神贯注于 node-gyp 之前,我一直在与它作斗争,但现在我什至不明白我曾认为这是一个问题。只要您添加构建工具 RUN apk add python make gcc g++
就可以了(但这会增加 100-200mb 的大小)。
此外,如果它变得非常耗时(比如您发现自己不时使用 --no-cache 重建图像),那么最好将其拆分为您自己的基础图像和另一个图像图片 FROM my-base-image:latest
包含您经常更改的内容。
肯定有一些学习曲线,但我没有发现它那么陡峭。至少如果您之前接触过 docker,则不会。
The other way I'm looking at is to build the Dockerfile FROM ubuntu:version.
在开始使用 docker 之前,我只使用过 CentOS,并且在我的服务器上运行 CentOS。所以我认为同时运行 CentOS-images 是个好主意,但我发现这很愚蠢。除非您需要非常特定于操作系统的东西,否则增益绝对为零。现在我只使用了大约半年的 alpine,到目前为止,我唯一需要学习的特定于 alpine 的命令是 apk add/del
。
您可能已经知道了,但不要在一开始就花太多时间优化 docker 文件大小。 (您可以通过在一行中组合命令(添加包、运行命令、删除包)来大大减少图层大小。但是如果您在大图层中进行任何小的更改,这会取消对 docker 图像缓存的使用。最好离开直到重要为止。
关于node.js - 将 Docker 与具有 node-gyp 依赖项的 nodejs 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371864/