Docker npm установка завершается неудачно с локальными зависимостями, но работает в командной строке - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь докернизировать проект, который использует некоторые частные npm зависимости, которые находятся на нашем сервере GitLab (url-это что-то вроде 10.1.1.150). Когда я запускаю npm установить в CMD, он работает отлично, но в Docker я получаю следующую ошибку:

npm ERR! Error while executing:
npm ERR! /usr/bin/git ls-remote -h -t https://10.1.1.150/WebDev/firstdependency.git
npm ERR!
npm ERR! remote: HTTP Basic: Access denied
npm ERR! fatal: Authentication failed for 'https://10.1.1.150/WebDev/firstdependency.git/'
npm ERR!
npm ERR! exited with error code: 128

Мой Dockerfile:

FROM node
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm set strict-ssl false --global
RUN git init
RUN git config --global http.sslVerify false
RUN git config http.emptyAuth true
RUN npm install --production
RUN mv node_modules ../
COPY . .
CMD npm start

Часть пакета. json файл, который содержит неисправные детали:

"repository": {
    "type": "git",
    "url": "https://10.1.1.150/WebDev/thisproject.git"
  },
  "dependencies": {
    "@mycompany/firstdependency": "git+https://10.1.1.150/WebDevelopment/firstdependency.git",
    "@mycompany/seconddependency": "git+https://10.1.1.150/WebDevelopment/seconddependency.git",
    "@mycompany/thirddependency": "git+https://10.1.1.150/WebDevelopment/thirddependency.git"

Я думаю, суть проблемы в том, что я не могу передать свои учетные данные в Dockerfile, поэтому он не может войти в наше локальное хранилище , ОС: WIN10 npm: 6.13.4 Docker: 19.03.2 Как устранить эту ошибку аутентификации?

1 Ответ

0 голосов
/ 13 февраля 2020

Я предполагаю, что вы проходите аутентификацию в своем личном реестре npm с помощью приватной сертификации s sh. В этом случае вам нужно будет использовать Docker Build Enhancements .

Вот несколько вещей, которые вам нужно обновить:

  • In ваш Dockerfile, добавьте эту строку в качестве первой строки: # syntax=docker/dockerfile:experimental
  • Измените RUN npm install --production на RUN --mount=type=ssh npm install --production
  • После этого вы можете построить свое изображение как docker build --ssh <image_name> .

Новый Dockerfile

# syntax=docker/dockerfile:experimental

FROM node
ENV NODE_ENV production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm set strict-ssl false --global
RUN git init
RUN git config --global http.sslVerify false
RUN git config http.emptyAuth true

RUN --mount=type=ssh npm install --production

RUN mv node_modules ../
COPY . .
CMD npm start

EDIT 1

Поскольку вы устанавливаете учетные данные в качестве переменных среды (которые вам следует подумать о том, чтобы изменить его на использование сертификата s sh), вот решение, которое я предлагаю.

  1. Подготовьте файл, содержащий имена и значения среды, которые вы используете для входа в систему git. Допустим, файл находится в /gitsecret.txt с содержимым вроде
GIT_USERNAME=<value>
GIT_PASSWORD=<value>
Обновите Dockerfile как
# syntax=docker/dockerfile:experimental

# Builder layer
FROM node as builder

ENV NODE_ENV production
WORKDIR /usr/src/app
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
RUN npm set strict-ssl false --global
RUN git init
RUN git config --global http.sslVerify false
RUN git config http.emptyAuth true
RUN --mount=type=secret,id=gitsecret \
    set -a; \
    source /run/secrets/gitsecret; \
    set +a; \
    npm install --production

# Main layer
FROM node

WORKDIR /usr/src/app

RUN mv node_modules ../

COPY --from=builder /usr/src/app/node_modules /usr/src/node_modules
COPY . .

CMD npm start
Теперь вы можете запустить команду docker build, например,
docker build --secret id=gitsecret,src=/gitsecret.txt <image_name> .

Таким образом, вы можете убедиться, что:

  • Секрет может использоваться только во время фаза сборки. Слой сборки будет удален из окончательного изображения, поэтому секретное изображение не останется в конечном изображении.
  • Секретное содержимое не будет распечатано во время сборки.

ПРИМЕЧАНИЕ У меня нет вашего полного исходного кода, поэтому я не гарантирую, что код будет работать для вашего случая только путем копирования и вставки. Тем не менее, идея есть, поэтому, пожалуйста, обновите ее соответственно!

...