我计划使用Docker来部署一个node.js应用程序。该应用程序有几个依赖项需要node-gyp。Node-gyp根据交付平台上的编译库构建这些模块(例如canvas,lwip,qrcode),根据我的经验,这些构建可能高度依赖于o/s版本和安装的库,并且它们经常破坏简单的 *npm安装 *。
那么构建我的DockerfileFROM node:version是正确的方法吗?这似乎是我目前找到的每个Docker/Node教程中展示的方法。但是如果我从节点镜像构建,当我部署容器时会发生什么?我如何确保目标主机拥有编译node-gyp模块所需的库?
另一种方法是从ubuntu:version构建Dockerfile。但我认为这意味着将nodeJS安装到Ubuntu镜像中,整个事情会大得多。
有没有其他的方法来处理这件事?
4条答案
按热度按时间gopyfrb31#
如何确保目标主机拥有编译node-gyp模块所需的库?
目标主机也在运行docker。只要依赖项在你的镜像中,那么你的服务器也会有。如果你问我,这就是docker的全部意义。如果它在本地运行,那么它也会在服务器上运行。
对于更小的文件,我会选择node-alpine(
FROM node:8-alpine
)。在我开始研究node-gyp之前,我一直在努力解决它,但现在我甚至不认为这是一个问题。只要你添加构建工具RUN apk add python make gcc g++
,你就可以开始了(这增加了100- 200 mb的大小)。此外,如果它曾经花费时间(比如说你发现自己不时地用--no-cache重建你的图像),那么把它分成你自己的基本图像和另一个图像
FROM my-base-image:latest
是一个好主意,它包含你更经常改变的东西。当然有一些学习曲线,但我不觉得它那么陡峭,至少如果你以前接触过docker的话。
另一种方法是从ubuntu:version构建Dockerfile。
我在使用Docker之前只使用过CentOS,我在我的服务器上运行CentOS。所以我认为也运行CentOS镜像是个好主意,但我发现这很愚蠢。除非你需要非常特定的操作系统,否则绝对没有任何收益。现在我只使用alpine大概半年,到目前为止,我需要学习的唯一alpine特定命令是
apk add/del
。你可能已经知道了,但是不要在一开始就花太多时间优化docker文件大小。(你可以通过在一行中组合命令来减少层的大小,(添加包,运行命令,删除包)。但是如果你在大层中做任何小的更改,那就取消了docker镜像缓存的使用。最好把它放在一边,直到重要的时候。
bis0qfac2#
如果你需要使用node-gyp构建东西,你可以添加下面的行,替换你的
npm install
或yarn install
:字符串
或者更简单,你可以安装
alpine-sdk
,它类似于Debian的build-essentials
型
来源:https://github.com/mhart/alpine-node/issues/27#issuecomment-390187978
ou6hu8tu3#
回顾过去(2年后),在容器中管理节点依赖仍然是一个挑战。我现在做的是:
1.构建docker镜像FROM node:10.16.0-alpine(或其他node版本)。这些是hub.docker.com上的官方 node 镜像。Docker推荐alpine,Nodejs在此基础上构建,包括node-gyp,所以这是一个很好的起点;
1.包含一个RUN apk add --no-cache,以包含构建依赖模块所需的所有库,例如 canvas(参见下面的示例);
1.在docker构建文件中包含一个RUN npm install canvas;这会将节点模块(例如canvas)构建到docker image 中,因此它会加载到从该image运行的任何容器中。
但这可能会变得很难看。Alpine使用来自更重量级操作系统的不同库:值得注意的是,alpine使用 musl 代替 glibc。依赖模块可能需要链接到 glibc,因此您必须将其添加到映像。Sasha Gerrand提供了一种使用alpine-pkg-glibc的方法
安装node-canvas v2.5的示例,它链接到 glibc:
字符串
mbjcgjjk4#
2023回答:
字符串