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

Pet*_*ger 6 docker

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

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

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

Dockerfile

FROM node:alpine
RUN npm install --production
CMD npm start
Run Code Online (Sandbox Code Playgroud)

泊坞窗,compose.yml

services:
   node-api:
        build:
            context: .
            dockerfile: Dockerfile
Run Code Online (Sandbox Code Playgroud)

我知道这不起作用,因为我没有在Docker上下文中使用我的本地系统上的部署密钥.

我四处寻找解决方案,似乎没有一个非常容易/非hacky

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

  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 不支持的密钥'卷')

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

Rob*_*ert 10

让我们试验这个新功能: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
...
Run Code Online (Sandbox Code Playgroud)

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