一尘不染

在docker的构建阶段内使用github私有仓库部署密钥进行npm安装

docker

我的用例是,我有多个使用相同中间件的快速微服务,并且我想为每个中间件创建一个npm模块格式的不同存储库。

每个存储库都是私有存储库,可以附加一个部署密钥(可以是不同的密钥,也可以是相同的密钥)

所有这些在本地都可以。但是,当我尝试在docker-compose安装程序中使用它时,它在构建阶段的npm install步骤中失败。

Docker文件

FROM node:alpine
RUN npm install --production
CMD npm start

docker-compose.yml

services:
   node-api:
        build:
            context: .
            dockerfile: Dockerfile

我知道这是行不通的,因为我没有在Docker上下文中在本地系统上使用的部署密钥。

我到处寻找解决方案,但似乎没有一个很容易/很不客气

  1. 复制密钥并压扁(缺点:不确定我如何在docker-compose文件中执行此操作)http://blog.cloud66.com/pulling-git-into-a-docker-image-without-leaving-ssh-背后的钥匙/

  2. 在构建步骤中复制密钥并添加到图像。(缺点:不是很安全:()

  3. 使用密钥作为构建参数。(缺点:请参阅2)

  4. 首先运行Dockerise之类的https://www.vaultproject.io/之类的东西,添加密钥并在节点容器中使用它来获取最新密钥。(缺点:可能很多工作,也许还有其他问题?)

  5. 使用Docker机密和Docker堆栈部署并将密钥存储在Docker机密中(CON:Docker堆栈部署尚不支持Docker卷。请参见此处https://docs.docker.com/compose/bundles/#production-a-bundle 不支持的键“音量”)

我的问题是,最 安全的
自动化解决方案是什么(文件用户的最小手动步骤)?实施时间无关紧要。我试图避免检入任何敏感数据,同时使其他人可以轻松地在本地运行此数据。


阅读 227

收藏
2020-06-17

共1个答案

一尘不染

让我们尝试一下这个新功能:Docker多阶段构建

您可以有选择地将工件从一个阶段复制到另一个阶段,从而在最终图像中留下不需要的所有内容。

这个想法是构建一个临时的基础映像,然后仅从上一个映像中获取您想要的内容,然后再次开始构建。它在 同一个 Dockerfile中使用多个FROM :

FROM node as base-node-modules
COPY your_secret_key /some/path
COPY package.json /somewhere
RUN npm install <Wich use your key>

FROM node #yes again!
...
...
COPY --from=base-node-modules /somewhere/node_modules /some/place/node_modules
...
... # the rest of your Dockerfile
...

Docker将丢弃您从第一个FROM中未保存的所有内容。

2020-06-17