使用Docker和nodejs以及node-gyp依赖项

5sxhfpxr  于 12个月前  发布在  Docker
关注(0)|答案(4)|浏览(195)

我计划使用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镜像中,整个事情会大得多。
有没有其他的方法来处理这件事?

gopyfrb3

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镜像缓存的使用。最好把它放在一边,直到重要的时候。

bis0qfac

bis0qfac2#

如果你需要使用node-gyp构建东西,你可以添加下面的行,替换你的npm installyarn install

RUN apk add --no-cache --virtual .build-deps make gcc g++ python \
RUN npm install --production --silent \
RUN apk del .build-deps

字符串
或者更简单,你可以安装alpine-sdk,它类似于Debian的build-essentials

RUN apk add --no-cache --virtual .build-deps alpine-sdk python \
RUN npm install --production --silent \
RUN apk del .build-deps

来源:https://github.com/mhart/alpine-node/issues/27#issuecomment-390187978

ou6hu8tu

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

#  geo_core layer
#  build on a node image, in turn built on alpine linux, Docker's official linux pulled from hub.docker.com

FROM node:10.16.0-alpine

#  add libraries needed to build canvas
RUN apk add --no-cache \
    build-base \
    g++ \
    libpng \
    libpng-dev \
    jpeg-dev \
    pango-dev \
    cairo-dev \
    giflib-dev \
    python \
    ; \

#  add glibc and install canvas
RUN apk --no-cache add ca-certificates wget  && \
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk && \
    apk add glibc-2.29-r0.apk && \
    npm install [email protected]
    ;

字符串

mbjcgjjk

mbjcgjjk4#

2023回答:

# Wont work with any version newer version of node
FROM --platform=linux/amd64 node:8-alpine

# Build dependencies
RUN apk add make gcc g++ python3

# Avoid "gyp ERR! stack Error: certificate has expired"
ENV NODE_TLS_REJECT_UNAUTHORIZED=0

WORKDIR /app

COPY . .

RUN npm install

EXPOSE 3000

CMD ["sh"]

字符串

相关问题