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

Use github private repo deploy key inside build stage in docker for npm install

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

每个回购都是私有回购,可以附加部署密钥(可以是不同的密钥或相同的密钥)

所有这些在本地都可以正常工作。但是,当我尝试将它与Docker Compose安装程序一起使用时,它在构建阶段的NPM安装步骤失败。

文档文件

1
2
3
FROM node:alpine
RUN npm install --production
CMD npm start

docker-compose.yml公司

1
2
3
4
5
services:
   node-api:
        build:
            context: .
            dockerfile: Dockerfile

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

我四处寻找解决方案,没有一个看起来很容易/不容易破解。

  • 复制key-in和squash(缺点:不确定如何在docker撰写文件中执行此操作)http://blog.cloud66.com/pulling-git-into-a-docker-image-without-leaving-ssh-keys-behind/

  • 复制生成步骤中的键并添加到映像。(缺点:不太安全:()

  • 使用键作为生成参数。(缺点:见2)

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

  • 使用docker secrets和docker stack deploy并将密钥存储在docker secrets中(con:docker stack deploy还不支持docker卷)。请参阅此处https://docs.docker.com/compose/bundles/producing-a-bundle不支持的密钥"volumes")。

  • 我的问题是什么是最安全的自动化解决方案(文件用户的最低手动步骤)?实施时间不那么令人担心。我尽量避免签入任何敏感数据,同时让其他人在本地轻松运行这些数据。


    让我们来试验一下这个新特性:Docker多阶段构建

    You can selectively copy artifacts from one stage to another, leaving behind everything you don’t want in the final image.

    其想法是构建一个临时的基础映像,然后重新开始构建,只从上一个映像中获取所需的内容。它在同一个dockerfile中使用了multiple-from:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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会放弃所有你从一开始就没有保存的东西。