我的用例是,我有多个使用相同中间件的快速微服务,并且我想为每个中间件创建一个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上下文中在本地系统上使用的部署密钥。
我到处寻找解决方案,但似乎没有一个很容易/很不客气
复制密钥并压扁(缺点:不确定我如何在docker-compose文件中执行此操作)http://blog.cloud66.com/pulling-git-into-a-docker-image-without-leaving-ssh-背后的钥匙/
在构建步骤中复制密钥并添加到图像。(缺点:不是很安全:()
使用密钥作为构建参数。(缺点:请参阅2)
首先运行Dockerise之类的https://www.vaultproject.io/之类的东西,添加密钥并在节点容器中使用它来获取最新密钥。(缺点:可能很多工作,也许还有其他问题?)
使用Docker机密和Docker堆栈部署并将密钥存储在Docker机密中(CON:Docker堆栈部署尚不支持Docker卷。请参见此处https://docs.docker.com/compose/bundles/#production-a-bundle 不支持的键“音量”)
我的问题是,最 安全的 自动化解决方案是什么(文件用户的最小手动步骤)?实施时间无关紧要。我试图避免检入任何敏感数据,同时使其他人可以轻松地在本地运行此数据。
让我们尝试一下这个新功能: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中未保存的所有内容。