Node.js docker build+;专用NPM(专用码头中心)
我有一个在Docker容器中运行的应用程序。它需要一些来自公司私有NPM注册中心(Sinopia)的私有模块,访问这些模块需要用户身份验证。Dockerfile是来自iojs:latest的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过程中对用户进行身份验证。我希望有人可能已经遇到了这个问题(
我试过:
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 .