2015-06-01 53 views
10

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

我曾尝试:

1)创造在项目的根的.npmrc文件,这其实没有什么区别和NPM似乎使用ENV变量NPM_CONFIG_REGISTRYNPM_CONFIG_USER等忽略它 2),但用户不会登录。

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

(最糟糕的是,我使用的是自动上泊坞枢纽(触发推送)建立,使我们的服务器可以访问的私人码头工人注册表与预置的图片。)

是否有好办法或者: 1)在构建时为NPM注入证书(所以我不必将证书提交给我的Dockerfile)或 2)以另一种方式,我还没有想到 ?

+0

你有没有解决这个问题?我遇到了同样的问题:( –

+0

是的,只是发布了我的答案! – GTF

回答

19

我找到了几分优雅十岁上下的解决方案,为您创造的Node.js/io.js容器基本映像(you/iojs):在您的私人NPM注册表与用户

  1. 日志要用于搬运工
  2. 复制.npmrc文件,这产生

.npmrc

registry=https://npm.mydomain.com/ 
username=dockerUser 
[email protected] 
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" ] 
  • 让所有的Node.js/io.js容器FROM you/iojs,你是好去。
  • +0

    我今天做了一个类似的事情,它是我在构建时需要的所有项目中唯一的秘密密钥:(我认为这是目前最好的解决方案,感谢您发布您的答案! –

    +0

    以下是关于private npm repo和Docker的官方码头:https://docs.npmjs.com/private-modules/docker-and-private-modules – magohamoth

    3

    对于那些谁发现通过谷歌本文以及还在寻找不涉及让您在码头工人的图像和集装箱专用NPM令牌的另一种方式:

    我们能够得到这个通过在docker build之前执行npm install(通过这样做,您可以在图像\容器外部使用.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。这将重建任何本地依赖,受到您的生成服务器和您的码头操作系统之间的任何差异的影响:

    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