我有一个在Docker容器中运行的应用程序。它需要一些来自公司私有NPM注册表(Sinopia)的私有模块,访问这些模块需要用户身份验证。Docker文件是FROM iojs:latest
。
我试过:
1)在项目根目录中创建一个.npmrc文件,这实际上没有什么区别,npm似乎忽略了它2)使用NPM_CONFIG_REGISTRY
、NPM_CONFIG_USER
等的env变量,但用户没有登录。
从本质上讲,我似乎没有办法在docker build
进程中对用户进行身份验证。我希望有人可能已经遇到了这个问题(似乎是一个足够明显的问题),并有一个很好的方法来解决它。
(To最重要的是,我在Docker Hub上使用了自动构建(在推送时触发),这样我们的服务器就可以使用预构建的映像访问私有Docker注册表。)
是否有好的方法:1)在构建时为NPM注入凭据(这样我就不必将凭据提交到我的Dockerfile),或者2)用我没有想到的另一种方式来做这件事?
6条答案
按热度按时间eh57zj3b1#
我在为node.js/io.js容器(
you/iojs
)创建一个基础映像时发现了一个比较优雅的解决方案:1.登录到你的私人npm注册表与这用户你想使用的docker
1.复制此操作生成的
.npmrc
文件示例
.npmrc
:1.创建一个
Dockerfile
,它可以适当地复制.npmrc
文件。下面是我的
Dockerfile
(基于iojs:onbuild
):1.将所有的node.js/io.js容器都设置为
FROM you/iojs
,就可以开始了。2izufjch2#
在2020年,我们推出了BuildKit,你不必再通过
COPY
或ENV
传递秘密,因为这被认为是不安全的。样品
Dockerfile
:然后,您的建置命令可能如下所示:
如需详细信息,请参阅:https://docs.docker.com/develop/develop-images/build_enhancements/#new-docker-build-secret-information
slsn1g293#
对于那些通过google找到这篇文章,并且仍然在寻找一种替代方式,不涉及在你的Docker图像和容器上留下你的私人npm令牌的人:
我们可以在
docker build
之前先执行npm install
(这样做可以让您的.npmrc
不在您的image\container中)。一旦私有模块安装在本地,您就可以将您的文件复制到映像中,作为构建的一部分:您还需要确保您的
.dockerignore
文件不排除node_modules
文件夹。一旦你把文件夹复制到你的映像中,技巧是复制到
npm rebuild
而不是npm install
。这将重建任何受构建服务器和docker操作系统之间的差异影响的本机依赖关系:w80xi6nr4#
我建议不要使用
.npmrc
文件,而是使用npm config set
文件。这样做很有魅力,而且更干净:von4xj4u5#
buildkit的答案是正确的,除了它以root身份运行所有内容,这被认为是一种糟糕的安全做法。
下面是一个工作的Dockerfile,它使用正确的用户
node
作为节点Dockerfile设置。注意,secret mount设置了uid
参数,否则它将以root用户的身份挂载,用户node
无法读取该参数。还要注意,将node:node
更改为user:group
的正确COPY命令inn6fuwd6#
@paul-s现在应该是可接受的答案,因为它是更新的IMO。作为补充,您提到您正在使用
docker/build-push-action
操作,因此您的工作流程必须如下所示:然后,当然,使用您指定的ID从您的dockerfile绑定
.npmrc
文件。在我的例子中,我使用的是基于Debian的映像(uid从1000开始)。