使用.npmrc的Docker和私有包

时间:2018-06-14 07:18:32

标签: docker npm docker-compose font-awesome

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

没有泊坞工,它运作良好。

但是对于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,我不确定传递变量是解决方案(?)。 在docker实例中安装期间是否可能未读取.npmrc文件?我错过了什么吗?

这是我的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(已更换令牌):

@fortawesome:registry=https://npm.fontawesome.com/
//npm.fontawesome.com/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXX

4 个答案:

答案 0 :(得分:2)

如您引用的链接中所述,解决此问题的正确方法是在 dockerfile 中使用 arg 变量。我认为你缺少的一点是如何在撰写中做到这一点:

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

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

//registry.npmjs.org/:_authToken=${NPM_TOKEN}

我喜欢在 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

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

答案 1 :(得分:1)

删除package-lock.json解决了该问题!

答案 2 :(得分:0)

要解决此问题,我按照此URL上的说明进行操作: https://blog.risingstack.com/private-npm-with-docker/

我对compose不太熟悉,但我希望这种Dockerfile技术能有所帮助。

将此添加到您的Dockerfile:

ARG AUTH_TOKEN  
COPY .npmrc .npmrc  
COPY package.json package.json  
RUN npm install  
RUN rm -f .npmrc

ARG AUTH_TOKEN允许您在构建时插入存储在名为AUTH_TOKEN的变量中的参数,该参数可在您的代码中使用

因此,首先,您需要在.npmrc中使用该新变量:

    @fortawesome:registry=https://npm.fontawesome.com
//npm.fontawesome.com/:_authToken=${AUTH_TOKEN}

然后您可以通过命令行运行docker build命令:

docker build --build-arg AUTH_TOKEN="XXXXXXXXXXXXXXXXX" .

稍后,我将尝试返回并进行更新以与docker compose一起使用。

答案 3 :(得分:-1)

  1. 第一步也是非常重要的一步是将 .npmrc 添加到 .gitignore 文件中。

  2. 在您项目的根目录中,创建一个包含以下内容的自定义 .npmrc 文件:

    //registry.npmjs.org/:_authToken=${NPM_TOKEN}

  3. 现在将这些命令添加到 Dockerfile

    复制.npmrc .npmrc
    复制 package.json package.json
    运行 npm 安装
    运行 rm -f .npmrc

应该可以解决问题,希望有帮助