【问题标题】:Use github private repo deploy key inside build stage in docker for npm install在 docker 的构建阶段使用 github 私有 repo 部署密钥进行 npm install
【发布时间】:2017-11-29 02:56:09
【问题描述】:

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

每个 repo 都是一个私有 repo,并且可以附加一个部署密钥(可以是不同的密钥或相同的密钥)

所有这些在本地都可以正常工作。但是,当我尝试将它与我的 docker-compose 设置一起使用时,它在构建阶段的 npm install 步骤中失败。

Dockerfile

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

docker-compose.yml

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

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

我已经四处寻找解决方案,但没有一个看起来很简单/非 hacky

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

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

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

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

  5. 使用 Docker secrets 和 docker stack deploy 并将密钥存储在 docker secrets 中(缺点:docker stack deploy 尚不支持 docker 卷。请参阅此处https://docs.docker.com/compose/bundles/#producing-a-bundle unsupported key 'volumes')

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

【问题讨论】:

标签: docker


【解决方案1】:

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

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

我们的想法是构建一个临时基础镜像,然后再次开始构建,只从前一个镜像中获取您想要的内容。它在 same 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 中没有保存的所有内容。

【讨论】:

  • 这正是我所需要的!谢谢!
  • 不客气!检查你的 docker 版本是否支持这个特性,因为太新了(它只需要构建的 docker,而不是最终运行的那个)
  • 我只希望它用于我们的 CI 构建和本地版本,该版本的 docker 可以。再次感谢,我一直在寻找解决方案!
  • 很高兴听到这个消息:)
猜你喜欢
  • 2021-12-04
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2021-08-22
  • 2020-11-20
  • 2018-10-06
  • 2017-08-22
相关资源
最近更新 更多