docker build +私人NPM(+私人码头中心)

时间:2015-06-01 12:27:51

标签: node.js docker npm docker-registry npm-private-modules

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

我试过了:

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

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

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

是否有好方法: 1)在构建时注入NPM的凭据(因此我不必将凭据提交到我的Dockerfile)或者 2)这样做是我想不到的另一种方式 ?

3 个答案:

答案 0 :(得分:24)

我在为您的node.js / io.js容器(you/iojs)创建基本映像时找到了一个优雅的解决方案:

  1. 使用您要用于docker的用户
  2. 登录您的私人npm注册表
  3. 复制此生成的.npmrc文件
  4. 示例.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文件。
    2. 这是我的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,您就可以了。

答案 1 :(得分:5)

对于那些通过谷歌发现这篇文章的人,仍然在寻找一种替代方法,不会让您在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文件夹。

将文件夹复制到图片后,诀窍是npm rebuild而不是npm install。这将重建由构建服务器和docker OS之间的任何差异影响的任何本机依赖:

    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

答案 2 :(得分:1)

在2020年,我们将提供BuildKit。您不再需要通过COPYENV传递秘密,因为它不安全。

示例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