Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js docker build+;专用NPM(专用码头中心)_Node.js_Docker_Npm_Docker Registry_Npm Private Modules - Fatal编程技术网

Node.js docker build+;专用NPM(专用码头中心)

Node.js docker build+;专用NPM(专用码头中心),node.js,docker,npm,docker-registry,npm-private-modules,Node.js,Docker,Npm,Docker Registry,Npm Private Modules,我有一个在Docker容器中运行的应用程序。它需要一些来自公司私有NPM注册中心(Sinopia)的私有模块,访问这些模块需要用户身份验证。Dockerfile是来自iojs:latest的 我试过: 1) 在项目根目录中创建一个.npmrc文件,这实际上没有什么区别,npm似乎忽略了它 2) 为NPM\u CONFIG\u注册表、NPM\u CONFIG\u用户等使用环境变量,但用户不登录 本质上,我似乎无法在docker build过程中对用户进行身份验证。我希望有人可能已经遇到了这个问题(

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

我试过:

1) 在项目根目录中创建一个.npmrc文件,这实际上没有什么区别,npm似乎忽略了它 2) 为
NPM\u CONFIG\u注册表
NPM\u CONFIG\u用户
等使用环境变量,但用户不登录

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

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

有没有好的方法: 1) 在构建时为NPM注入凭据(因此我不必将凭据提交到Dockerfile)或 2) 用我从未想过的另一种方式做这件事

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

  • 使用要用于docker的用户登录到您的专用npm注册表
  • 复制由此生成的
    .npmrc
    文件
  • 示例
    .npmrc

    registry=https://npm.mydomain.com/
    username=dockerUser
    email=docker@mydomain.com
    strict-ssl=false
    always-auth=true
    //npm.mydomain.com/:_authToken="someAuthToken"
    
  • 创建一个
    Dockerfile
    ,适当复制
    .npmrc
    文件
  • 这是我的
    Dockerfile
    (基于
    iojs:onbuild
    ):

  • 从您的/iojs
  • 创建所有node.js/io.js容器
    ,就可以开始了
    
    对于那些通过谷歌找到这篇文章并仍在寻找替代方法的人,不需要在docker图像和容器上留下您的私人npm代币:

    我们能够通过在docker构建之前安装
    npm
    来实现这一点(通过这样做,您可以将
    .npmrc
    放在图像\容器之外)。在本地安装专用模块后,您可以将文件作为构建的一部分复制到映像中:

        # Make sure the node_modules contain only the production modules when building this image
        COPY . /usr/src/app
    
    您还需要确保
    .dockrignore
    文件不排除
    节点模块
    文件夹

    一旦将文件夹复制到图像中,技巧是
    npm重建
    ,而不是
    npm安装
    。这将重建由生成服务器和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
    

    2020年,我们有了BuildKit。您不必再通过
    COPY
    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 .
    

    有关更多详细信息,请查看:

    您解决过这个问题吗?我遇到了同样的问题:(是的,刚刚发布了我的答案!今天我做了一件类似的事情。这是我所有项目中在构建时需要的唯一密钥:(.我认为这是目前最好的解决方案,感谢您发布您的答案!这是关于私人npm回购和Docker的官方dock:当心不推荐使用,改用。
    docker build --no-cache --progress=plain --secret id=npmrc,src=/path-to/.npmrc .