在企业防火墙后面的 docker 中 npm UNABLE_TO_GET_ISSUER_CERT_LOCALLY

sas*_*alm 6 ssl-certificate npm docker

我在 Dockerfile 中以 root 身份运行 npm 时遇到错误。

 > [runner  5/10] RUN npm install --global pm2:
#0 71.79 npm ERR! code UNABLE_TO_GET_ISSUER_CERT_LOCALLY
Run Code Online (Sandbox Code Playgroud)

我们有一个无法关闭的防病毒/企业防火墙,它可以替代 SSL 证书来检查流量。

我的问题是,因为npm install --global pm2以 root 身份运行,所以它不尊重export NODE_EXTRA_CA_CERTS=/path/to/my-cacert.crt.

我尝试过RUN npm config set cafile /path/to/my-cacert.crt,但由于某种原因也不起作用。

UNABLE_TO_GET_ISSUER_CERT_LOCALLY在 docker 容器中以 root 身份运行 npm 时如何修复?

此 dockerfile 重现了该问题:

FROM node:alpine AS deps

COPY my.crt /usr/local/share/ca-certificates/
RUN cat /usr/local/share/ca-certificates/my.crt >>/etc/ssl/certs/ca-certificates.crt

RUN npm install --global pm2
Run Code Online (Sandbox Code Playgroud)

小智 1

如果你发布你的 Dockerfile 将会很有帮助,

但您有多种选择。

1-而不是在 dockerfile 中使用exportset your NODE_EXTRA_CA_CERTSwithARG选项,它将用于所有用户,如果您在构建之间更改用户,则无关紧要,如下所示:

FROM node:alpine AS deps

ARG NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt

COPY my.crt /usr/local/share/ca-certificates/
RUN cat /usr/local/share/ca-certificates/my.crt >>/etc/ssl/certs/ca-certificates.crt

RUN npm install --global pm2
Run Code Online (Sandbox Code Playgroud)

但是,如果您设置一个变量,export它将仅用于RUN您使用的条目export。请记住,如果您正在进行多阶段构建ARG,则其范围仅限于其阶段,并且如果您需要在不同的阶段中进行设置,则必须ARG在每个阶段中使用您的。

2-使用http而不是https(它不安全但可用)。您可以在配置中 设置它,例如:npm config set registry http://registry.npmjs.org/

3-将您的 CA 证书添加到 Dockerfile 中的受信任证书中,例如:

...
COPY ca.crt /usr/local/share/ca-certificates/ca.crt
RUN apt update && \
  apt install -y ca-certificates && \
  update-ca-certificates
...

Run Code Online (Sandbox Code Playgroud)