Я получаю сообщение об ошибке при запуске npm от имени пользователя root в Dockerfile.
> [runner 5/10] RUN npm install --global pm2:
#0 71.79 npm ERR! code UNABLE_TO_GET_ISSUER_CERT_LOCALLY
У нас есть антивирус / корпоративный брандмауэр, который мы не можем отключить, который заменяет 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
при запуске npm от имени пользователя root в контейнере докеров?
Этот 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
Если вы опубликуете свой Dockerfile, это будет полезно,
но есть несколько вариантов для вас.
1- вместо использования export
установите параметр NODE_EXTRA_CA_CERTS
с параметром ARG
в файле докеров, он будет использоваться для всех пользователей, независимо от того, измените ли вы своего пользователя между сборками следующим образом:
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
Но если вы установите переменную с помощью 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
...
На самом деле, ваше решение с ARG NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
сработало. Спасибо!
Спасибо, я назначу вам награду, как только система это позволит.
Я обновил вопрос с образцом Dockerfile.