Docker 和带有 .npmrc 的私有包

问题描述 投票:0回答:6

我正在使用

.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

我已经阅读了 NPM 的文档:Docker 和私有包,但我不知道如何使用

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
docker npm docker-compose font-awesome
6个回答
11
投票

解决此问题的正确方法(如您引用的链接中所述)是在 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 映像中包含秘密的问题,但这只是一个草图。在现实世界中,您不希望将机密放入源文件中,因此您可以将机密替换为具有较短生存时间 (TTL) 和一次性策略的动态机密(并且您我可能想使用 Hashicorp Vault 来帮助解决这个问题)。


6
投票

我遇到了同样的问题,但就我而言,我忘记将 .npmrc 文件复制到容器中,只复制了 package.json,然后将其添加到我的 Dockerfile 中

npm install
:

COPY .npmrc ./

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

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

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

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

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


0
投票

我想复制项目和用户的

.npmrc
文件,因为私人源安装需要这两个文件。 Docker 只能从指定的上下文复制文件,因此需要使用 additional_contexts 定义附加上下文。

# docker-compose.yml
services:
  my-service:
    ...
    build:
      context: .
      dockerfile: Dockerfile
      additional_contexts:
        user: ~/

# Dockerfile
FROM node:latest
COPY .npmrc .
COPY --from=user .npmrc /root/.npmrc
RUN npm config ls
COPY package.json .
RUN npm i

-1
投票

我们发现我们的一个 GitHub 存储库意外公开,并将其移至私有 AWS CodeArtifact 存储库。然后我们遇到了同样的问题。

问题的根本原因是我们已经

package-lock.json
签入了GitHub(一个很好的做法),但在里面,
package-lock.json
仍然引用了GitHub。

修复方法是删除 package-lock.json (这是一个一次性事件,因为我们正在切换注册表)并重新生成它。然后我们对其进行比较,以确保只有我们期望更改的包被修改为指向新的注册表。

以下是步骤(Windows):

del package.json
npm install

然后比较 package.json 以确保只有注册表发生了变化。


-3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.