Docker npm安装因本地依赖性而失败,但可在命令行中运行

时间:2020-02-13 08:25:23

标签: git docker authentication npm gitlab

我正在尝试将使用GitLab服务器上的一些私有npm依赖项的项目码头化(URL类似于10.1.1.150)。当我在CMD中运行npm install时,它可以正常运行,但是在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

package.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 码头工人:19.03.2 如何解决此身份验证错误?

1 个答案:

答案 0 :(得分:0)

我假设您正在通过ssh私人证书对您的私人npm注册表进行身份验证。在这种情况下,您将需要使用Docker Build Enhancements

以下是您需要更新的一些内容:

  • 在您的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

编辑1

由于您将凭据设置为环境变量(应考虑将其更改为使用ssh证书),因此,我建议您使用此解决方案。

  1. 准备一个文件,其中包含用于登录git的环境名称和值。假设文件位于/gitsecret.txt,内容为
GIT_USERNAME=<value>
GIT_PASSWORD=<value>
  1. 将您的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
  1. 现在您可以像这样运行docker build命令
docker build --secret id=gitsecret,src=/gitsecret.txt <image_name> .

这种方式是为了确保:

  • 该机密只能在构建阶段使用。构建层将从最终映像中删除,因此不会在最终映像中留下任何秘密。
  • 在构建过程中不会打印出秘密内容。

注意我没有您的完整源代码,因此无法保证该代码仅通过复制和粘贴即可适用于您的情况。但是,这里有想法,请相应地对其进行更新!