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

Strange errors when running npm install on alpine linux

Docker 文件:

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

如何解决这个问题?

不确定这是怎么回事。我显然没有你的应用程序,但我尝试安装 public 模块(例如 newman) and I hit the same error. Looking at the dockerhub page for that image, I found the Dockerfile - 这似乎卸载了 npm。确实,当我直接 运行 那个 dockerfile , 没有 npm - 所以我不确定 public 图像是如何保留它的,除非他们的构建过程目前以某种方式有点中断。

附带说明一下,这样做效率有点低:

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

这似乎工作正常。