我的用例是我有多个使用相同中间件的快速微服务,我想为每个中间件创建一个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上下文中使用我在本地系统上使用的部署密钥。
我已经四处寻找解决方案,似乎没有一个非常简单/非黑客
将密钥复制并压缩(缺点:不知道我是如何在docker-compose文件中执行此操作的)http://blog.cloud66.com/pulling-git-into-a-docker-image-without-leaving-ssh-keys-behind/
在构建步骤中复制键并添加到图像。 (缺点:不太安全:()
使用密钥作为构建参数。 (缺点:见2)
像https://www.vaultproject.io/之类的Dockerise首先运行它,添加密钥并在节点容器中使用它来获取最新密钥。 (缺点:可能很多工作,也许还有其他问题?)
使用Docker机密和docker堆栈部署并将密钥存储在docker机密中(CON:docker stack deploy还不支持docker卷。请参阅此处https://docs.docker.com/compose/bundles/#producing-a-bundle不支持的密钥'卷&#39 ;)
我的问题是什么是最强大的安全可行解决方案(文件用户的最小手动步骤)?实施时间不太重要。我试图避免检入任何敏感数据,同时让其他人可以轻松地在本地运行。
答案 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中保存的所有内容。