在 Docker 中使用私有 npm repo

gok*_*amy 5 node.js npm docker dockerfile devops

我们有一个使用 sinopia 托管的私有 npm 存储库,它具有基本的身份验证凭据。我们的应用程序使用私有仓库的 npm 包。我创建了身份验证令牌并尝试了它,但在该行出现错误RUN npm install utilities@0.1.9

npm ERR! code E403
npm ERR! 403 Forbidden: utilities@0.1.9
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-07-05T10_55_25_752Z-debug.log
Run Code Online (Sandbox Code Playgroud)

而我的Dockerfile是:

npm ERR! code E403
npm ERR! 403 Forbidden: utilities@0.1.9
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2018-07-05T10_55_25_752Z-debug.log
Run Code Online (Sandbox Code Playgroud)

错误日志是:

11 verbose stack     at tryCatcher (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/util.js:16:23)
11 verbose stack     at Promise._settlePromiseFromHandler (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:512:31)
11 verbose stack     at Promise._settlePromise (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:569:18)
11 verbose stack     at Promise._settlePromise0 (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:614:10)
11 verbose stack     at Promise._settlePromises (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:693:18)
11 verbose stack     at Async._drainQueue (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:133:16)
11 verbose stack     at Async._drainQueues (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:143:10)
11 verbose stack     at Immediate.Async.drainQueues (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/async.js:17:14)
11 verbose stack     at runCallback (timers.js:794:20)
11 verbose stack     at tryOnImmediate (timers.js:752:5)
11 verbose stack     at processImmediate [as _immediateCallback] (timers.js:729:5)
Run Code Online (Sandbox Code Playgroud)

谁能帮我这个?

Ell*_*urn 5

我猜这个包裹utilities@0.1.9是你的私人包裹?如果是这样,您的身份验证令牌似乎没有被使用或由于某种原因无法访问该包。

您可以尝试编写~/.npmrc文件而不是使用配置集,这只是使用的一种情况:

RUN echo -e "//private.repo/:_authToken=... > ~/.npmrc
Run Code Online (Sandbox Code Playgroud)

这将导致您的 docker 用户使用该令牌针对定义的注册表进行身份验证。这就是我们为 npm 设置身份验证令牌的大部分方式。

另一方面,您可能需要考虑不要一个接一个地使用多个 RUN 命令。这会导致为每个命令创建一个新的镜像层,并可能导致容器的大小膨胀。尝试&& \在命令末尾使用,然后将下一个命令放在没有RUN位的新行上。例如:

FROM keymetrics/pm2:latest-alpine

RUN mkdir -p /app

WORKDIR /app

COPY package.json ./
COPY .npmrc ./

RUN npm config set registry http://private.repo/:_authToken=$AUTH_TOKEN && \
  npm install utilities@0.1.9 && \
  apk update && apk add yarn python g++ make && rm -rf /var/cache/apk/* && \
  set NODE_ENV=production && \
  npm config set registry https://registry.npmjs.org/ && \
  npm install

COPY . /app

RUN ls -al -R

EXPOSE 51967

CMD [ "pm2-runtime", "start", "pm2.json" ]
Run Code Online (Sandbox Code Playgroud)

它应该同样具有可读性,但最终图像应该更小,并且构建速度可能会更快。