17

我有一个在 Docker 容器中运行的应用程序。它需要来自公司私有 NPM 注册表(Sinopia)的一些私有模块,并且访问这些需要用户身份验证。Dockerfile 是FROM iojs:latest.

我努力了:

1)在项目根目录中创建一个 .npmrc 文件,这实际上没有区别,npm 似乎忽略了它 2)使用 env 变量NPM_CONFIG_REGISTRYNPM_CONFIG_USER,但用户没有登录。

本质上,我似乎无法在docker build流程中对用户进行身份验证。我希望有人可能已经遇到过这个问题(似乎是一个足够明显的问题)并且会有一个解决它的好方法。

(最重要的是,我在 Docker Hub 上使用自动构建(在推送时触发),以便我们的服务器可以使用预构建的图像访问私有 Docker 注册表。)

有没有好的方法:1)在构建时为 NPM 注入凭据(所以我不必向我的 Dockerfile 提交凭据)或 2)以另一种我没有想到的方式执行此操作?

4

5 回答 5

32

在为您的 node.js / io.js 容器 ( you/iojs) 创建基础映像时,我发现了一个有点优雅的解决方案:

  1. 使用要用于 docker 的用户登录到您的私有 npm 注册表
  2. 复制.npmrc生成的文件

示例.npmrc

registry=https://npm.mydomain.com/
username=dockerUser
email=docker@mydomain.com
strict-ssl=false
always-auth=true
//npm.mydomain.com/:_authToken="someAuthToken"
  1. 创建一个适当地Dockerfile复制.npmrc文件的文件。

这是我的Dockerfile(基于iojs:onbuild):

FROM iojs:2.2.1

MAINTAINER YourSelf

# Exclude the NPM cache from the image
VOLUME /root/.npm

# Create the app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Copy npm config
COPY .npmrc /root/.npmrc

# Install app
ONBUILD COPY package.json /usr/src/app/
ONBUILD RUN npm install
ONBUILD COPY . /usr/src/app

# Run
CMD [ "npm", "start" ]
  1. 制作所有 node.js/io.js 容器FROM you/iojs,一切顺利。
于 2015-06-22T22:15:53.170 回答
12

对于那些通过 google 找到这篇文章并且仍在寻找一种不涉及在 docker 映像和容器上留下私有 npm 令牌的替代方法的人:

我们能够通过执行npm install之前的操作来完成这项工作docker build(通过这样做,您可以拥有.npmrc图像\容器之外的内容)。在本地安装私有模块后,您可以将文件复制到镜像中,作为构建的一部分:

    # Make sure the node_modules contain only the production modules when building this image
    COPY . /usr/src/app

您还需要确保您的.dockerignore文件不排除该node_modules文件夹。

将文件夹复制到图像中后,诀窍是 tonpm rebuild 而不是npm install. 这将重建受构建服务器和 docker 操作系统之间任何差异影响的任何本机依赖项:

    FROM nodesource/vivid:LTS

    # For application location, default from nodesource is /usr/src/app
    # Make sure the node_modules contain only the production modules when building this image
    COPY . /usr/src/app
    WORKDIR /usr/src/app
    RUN npm rebuild
    CMD npm start
于 2016-08-05T05:59:37.347 回答
12

2020 年,我们推出了 BuildKit。您不必通过COPYor传递秘密ENV,因为它不被认为是安全的。

样品Dockerfile

# syntax=docker/dockerfile:experimental
FROM node:13-alpine

WORKDIR /app

COPY package.json yarn.lock ./

RUN --mount=type=ssh --mount=type=secret,id=npmrc,dst=$HOME/.npmrc \
  yarn install --production --ignore-optional --frozen-lockfile

# More stuff...

然后,您的构建命令可能如下所示:

docker build --no-cache --progress=plain --secret id=npmrc,src=/path-to/.npmrc .

有关更多详细信息,请查看:https ://docs.docker.com/develop/develop-images/build_enhancements/#new-docker-build-secret-information

于 2020-09-22T15:15:09.920 回答
1

我建议不要使用.npmrc文件,而是使用npm config set. 这就像一个魅力,而且更干净:

ARG AUTH_TOKEN_PRIVATE_REGISTRY

FROM node:latest

ARG AUTH_TOKEN_PRIVATE_REGISTRY
ENV AUTH_TOKEN_PRIVATE_REGISTRY=${AUTH_TOKEN_PRIVATE_REGISTRY}

WORKDIR /home/usr/app

RUN npm config set @my-scope:registry https://my.private.registry && npm config set '//my.private.registry/:_authToken' ${AUTH_TOKEN_PRIVATE_REGISTRY}

RUN npm ci

CMD ["bash"]
于 2022-01-15T18:44:45.147 回答
0

buildkit 的答案是正确的,除了它以 root 身份运行所有内容,这被认为是一种不好的安全做法。

这是一个 Dockerfile,它工作并使用正确的用户node作为节点 Dockerfile 设置。请注意,秘密挂载具有uid参数集,否则它将以用户node无法读取的 root 身份挂载。user:group还要注意正确的COPY 命令node:node

FROM node:12-alpine

USER node

WORKDIR /home/node/app

COPY --chown=node:node package*.json ./

RUN --mount=type=secret,id=npm,target=./.npmrc,uid=1000 npm ci

COPY --chown=node:node index.js .

COPY --chown=node:node src ./src

CMD [ "node", "index.js" ]

于 2022-03-05T21:44:34.077 回答