在alpine linux上运行npm install时出现奇怪的错误

Dockerfile:

FROM iron/node RUN apk add --update bash && rm -rf /var/cache/apk/* RUN apk add --update curl && rm -rf /var/cache/apk/* WORKDIR /usr/src/app COPY . /usr/src/app RUN npm install CMD [ "node", "index.js" ] 

docker工人日志:

 Sending build context to Docker daemon 198.2 MB Step 1 : FROM iron/node ---> 9ca501065d18 Step 2 : RUN apk add --update bash && rm -rf /var/cache/apk/* ---> Using cache ---> 0a03d023f33e Step 3 : RUN apk add --update curl && rm -rf /var/cache/apk/* ---> Using cache ---> 3e0176dae102 Step 4 : WORKDIR /usr/src/app ---> Using cache ---> 3f9d925bd76c Step 5 : COPY . /usr/src/app ---> 0c2c195505dd Removing intermediate container de7cb9edede2 Step 6 : RUN npm install ---> Running in d7549ec2707d Error relocating /usr/bin/node: uv_os_free_passwd: symbol not found Error relocating /usr/bin/node: uv_os_get_passwd: symbol not found The command '/bin/sh -c npm install' returned a non-zero code: 127 

这是怎么回事? 这些错误是什么意思?

 Error relocating /usr/bin/node: uv_os_free_passwd: symbol not found Error relocating /usr/bin/node: uv_os_get_passwd: symbol not found 

如何解决这个问题?

不知道这是怎么回事。 我显然没有你的应用程序,但我试图做一个公共模块(例如纽曼 )的npm安装,我也遇到了同样的错误。 查看该图像的dockerhub页面 ,我find了Dockerfile – 这似乎是卸载npm。 事实上,当我直接运行dockerfile的时候,没有npm – 所以我不确定公共图像是如何保留的,除非他们的构build过程有点破碎。

作为一个方面说明,这样做有点低效:

 RUN apk add --update bash && rm -rf /var/cache/apk/* RUN apk add --update curl && rm -rf /var/cache/apk/* 

相反,你应该同时安装bash和curl:

 RUN apk add --update bash curl && rm -rf /var/cache/apk/* 

结合所有这些步骤(即直接使用dockerfile,并结合apk安装),而不是卸载npm给我:

 FROM iron/base:edge RUN echo '@edge http://nl.alpinelinux.org/alpine/edge/main' >> /etc/apk/repositories # RUN echo '@community http://nl.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories RUN apk update && apk upgrade \ && apk add nodejs@edge bash curl \ && rm -rf /var/cache/apk/* RUN npm install -g newman 

这似乎工作正常。