带有 .npmrc 的 Docker 和私有(private)包

标签 docker npm docker-compose font-awesome

我正在使用 .npmrc文件来配置一个私有(private)仓库(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
我已阅读 the doc from NPM : Docker and private packages ,但我不知道如何使用 docker-compose.yml而且我不确定传递变量是否是解决方案(?)。.npmrc 有可能吗?在 docker 实例内安装期间未读取文件?我错过了什么吗?
这是我的docker-compose.yaml :
version: '2.1'
services:
  app:
    image: node:8.9.4
    # restart: always
    container_name: jc-vc
    environment:
      - APP_ENV=${JC_ENV:-dev}
      - HOST=0.0.0.0
      - BASE_URL=${JC_BASE_URL}
      - BROWSER_BASE_URL=${JC_BROWSER_BASE_URL}
    working_dir: /usr/src/app
    volumes:
      - ${DOCKER_PATH}/jc/vc/app:/usr/src/app
    command: npm install
    # command: npm run dev
    # command: npm run lintfix
    # command: npm run build
    # command: npm start
    expose:
      - 3000
      
  nginx:
    image: nginx
    logging:
      driver: none
    # restart: always
    volumes:
      - ${DOCKER_PATH}/jc/vc/nginx/www:/usr/share/nginx/html
      - ${DOCKER_PATH}/jc/vc/nginx/default.${JC_ENV:-dev}.conf:/etc/nginx/nginx.conf
      - ${DOCKER_PATH}/jc/vc/nginx/.htpasswd:/etc/nginx/.htpasswd
      - ${DOCKER_PATH}/jc/letsencrypt:/etc/letsencrypt
    container_name: jc-nginx-vc
    depends_on:
      - app
    ports:
      - ${PORT_80:-4020}:${PORT_80:-4020}
      - ${PORT_443:-4021}:${PORT_443:-4021}
和我的.npmrc (替换 token ):
@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX

最佳答案

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

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

您需要在 dockerfile 中引用此参数并在项目的根目录中创建一个 .npmrc 文件:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
我喜欢在 dockerfile 中生成它以最大程度地降低暴露风险(但请注意, token 仍存储在图像的层中),因此它看起来像这样:
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
然后您可以运行 docker-compose build myapp并取得好成绩。此解决方案仍然会在您的撰写文件和 docker 图像中存在 secret ,但这只是 SO 的草图。在现实世界中,您不希望将 secret 放在源文件中,如此现实地使用具有短生存时间 (TTL) 和一次性策略的动态 secret 替换 secret (并且您d 可能想使用 Hashicorp Vault 来帮助解决这个问题)。

关于带有 .npmrc 的 Docker 和私有(private)包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50851711/

相关文章:

php - 无法将 docker mysql 数据库连接到 codeigniter 应用程序

javascript - TypeScript 从另一个项目/模块导入类?

node.js - OpenShift :/lib64/libz. so.1 上的 NodeJS 应用程序:未找到版本 `ZLIB_1.2.9'

asp.net-core - 使用 docker 链接时拒绝连接到 RabbitMQ

git - 需要安装 Perl 和 Linux

linux - 杀死正在运行的 docker 容器后进行清理

node.js - 为什么我在安装 npm 包时遇到这种类型的错误

docker - 停止并删除正在运行的容器

docker - 如何使用Docker Compose设置容器以使用静态IP并可以在VM主机外部访问?

docker - 在 Golang 中使用 docker 将敏感数据作为参数传递