Docker 和带有 .npmrc 的私有包

Tho*_*mas 6 npm font-awesome docker docker-compose

我正在使用一个.npmrc文件来配置一个私有仓库 (font-awesome-pro)。

它在没有 docker 的情况下运行良好。

但是对于 docker,npm install失败了:

npm ERR! code E401
npm ERR! 404 401 Unauthorized: @fortawesome/fontawesome-pro-light@https://npm.fontawesome.com/7D46BEC2-1565-40B5-B5FC-D40C724E60C6/@fortawesome/fontawesome-pro-light/-/fontawesome-pro-light-5.0.12.tgz
Run Code Online (Sandbox Code Playgroud)

我已经阅读了 NPM 的文档:Docker 和私有包,但我不知道如何应用它,docker-compose.yml我不确定传递变量是解决方案(?)。是否有可能.npmrc在 docker 实例中安装期间未读取该文件?我错过了什么吗?

这是我的docker-compose.yaml

npm ERR! code E401
npm ERR! 404 401 Unauthorized: @fortawesome/fontawesome-pro-light@https://npm.fontawesome.com/7D46BEC2-1565-40B5-B5FC-D40C724E60C6/@fortawesome/fontawesome-pro-light/-/fontawesome-pro-light-5.0.12.tgz
Run Code Online (Sandbox Code Playgroud)

和我的.npmrc(用替换的令牌):

@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

Eng*_*ery 9

解决此问题的正确方法(如您引用的链接中所述)是在 dockerfile 中使用 arg 变量。我认为您缺少的是如何在撰写中执行此操作:

version: "3"
services:
  myapp:
    build:
      context: "."
      args:
        NPM_TOKEN: "s3kr!t"

Run Code Online (Sandbox Code Playgroud)

您需要在 dockerfile 中引用此参数,并在项目的根目录中创建一个 .npmrc 文件:

//registry.npmjs.org/:_authToken=${NPM_TOKEN}
Run Code Online (Sandbox Code Playgroud)

我喜欢在 dockerfile 中生成它,以最大程度地降低暴露风险(但是,请注意,令牌仍然存储在图像的层中),因此它看起来像这样:

FROM node:current-buster-slim

ARG NPM_TOKEN  

WORKDIR /app

COPY package.json /app/package.json  

RUN echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > /app/.npmrc && \
    npm install && \
    rm -f /app/.npmrc


COPY . /app/
CMD npm start
Run Code Online (Sandbox Code Playgroud)

然后你就可以运行docker-compose build myapp并获得良好的结果。该解决方案仍然受到撰写文件和 docker 映像中包含秘密的影响,但这只是一个草图。在现实世界中,您不希望将机密放入源文件中,因此您可以将机密替换为具有较短生存时间 (TTL) 和一次性策略的动态机密(并且您我可能想使用 Hashicorp Vault 来帮助解决这个问题)。


Tho*_*mas -3

package-lock.json需要用新文件重新生成.npmrc。删除它package-lock.json并重新创建它,npm install然后重新部署映像。