在docker的build阶段内使用github private repo deploy key进行npm install

时间:2017-06-26 09:39:53

标签: docker

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

每个仓库都是私人仓库,可以附加部署密钥(可以是不同的密钥或相同的密钥)

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

Dockerfile

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

搬运工-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-keys-behind/

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

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

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

  5. 使用Docker机密和docker堆栈部署并将密钥存储在docker机密中(CON:docker stack deploy还不支持docker卷。请参阅此处https://docs.docker.com/compose/bundles/#producing-a-bundle不支持的密钥'卷&#39 ;)

  6. 我的问题是什么是最强大的安全可行解决方案(文件用户的最小手动步骤)?实施时间不太重要。我试图避免检入任何敏感数据,同时让其他人可以轻松地在本地运行。

1 个答案:

答案 0 :(得分:8)

让我们试验这个新功能:Docker multi stage build

  

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

我们的想法是构建一个临时基本映像,然后再次启动构建,只需从前一个映像中获取所需内容。它在相同 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中保存的所有内容。