node.js - 将 Docker 与具有 node-gyp 依赖项的 nodejs 一起使用

标签 node.js ubuntu docker containers node-gyp

我打算使用 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/

相关文章:

javascript - Angular2 构建 : Cannot find name 'Promise' only in Visual Studio

javascript - 基于 Promise 的 net.createServer 版本

javascript - Node.js url 方法返回 null

perl - 如何确保用户不会意外读取我的 CGI 代码

ubuntu - docker登录错误: no such host

ubuntu - ubuntu 中的 android studio 错误启动

node.js - 在 Nodejs Express 中实现单元测试 - 意外失败

linux - 各种docker容器的日志管理

java - 无法从本地 IDE 连接到 docker hbase

docker - 如何退出因网络错误而卡住的 `kubectl exec` 命令?