docker git 工作流
原文地址: https://itnext.io/building-docker-images-from-private-git-repositories-using-ssh-login-433edf5a18f2
Docker 是一个了不起的工具。在这篇文章中,我将逐步向您展示如何设置 docker 文件,以便您可以克隆私有 github 存储库并在公共映像中使用从该存储库构建的内容,而无需担心公共镜像中暴露私有凭证。以下例子,我使用从私有存储库构建 vue.js 应用程序并使用构建的应用程序设置 Web 服务器。
本教程有3个步骤。
- 从git仓库克隆和构建docker镜像
- 在设置精益网络服务器之前,使用构建器镜像来构建应用程序
- 将ssh密钥导入构建器以克隆私有仓库
npm 开发服务环境不应该在生产中使用,这样会导致镜像文件会变得很大,比如上面的示例超过 1 GB,因为所有开发依赖项包都要安装。因此,我们可以使用高效的网络服务器(apache、nginx)作为base image,安装构建app所需的所有内容,构建完成后删除我们安装的所有内容。但这不会使镜像变小,因为 docker 会为每个执行的命令创建一个层,并默认保留所有层。您可以手动删除镜像层,但这很复杂并且可能会导致问题。 (如果您想阅读图层,请在此处查看示例。)
在发布我们的精简App之前,使用构建器镜像来构建应用程序
正确的方法是分阶段构建。
首先我们创建一个作为构建器的镜像,在那里安装我们需要的所有依赖,并构建最终的应用程序
第二阶段,创建生产性的网络服务器镜像,并从构建器中复制我们需要的文件。
FROM node as builder
RUN git clone https://github.com/phillies/vue_example.git /opt/vue_example
WORKDIR /opt/vue_example
RUN npm install && npm run build
FROM nginx
COPY --from=builder /opt/vue_example/dist/ /usr/share/nginx/html/
EXPOSE 80
我们首先创建与之前几乎相同的镜像,并给它起名为builder,但我们在最后没有执行RUN命令,而是构建了我们应用程序的生产版本。&&将命令连接起来,所以它们被一个接一个地执行,并且只创建一个层。这不是必须的,但我更喜欢将命令分组,只创建必要的小层。
然后,我们创建第二个基于nginx的镜像,并将构建的应用程序从构建器中复制到我们的网络服务器镜像。最后的镜像只有110MB,只有应用程序,没有构建过程的痕迹。(对于apache,使用httpd作为基础镜像,并将目标目录替换为/usr/local/apache2/htdocs/)
现在我们可以发布容器,下载该镜像的用户将只得到生产环境的代码和一个基本的Web服务器。接下来是克隆一个私有仓库(这里是:Github)的重要部分。
将ssh密钥导入构建器,以克隆私有存储库
当你想build一个镜像从私人git仓库创建应用程序时,你需要通过某种方式将凭证传递到docker build过程中,以允许git登录到你的git仓库。在镜像中我们在docker的克隆命令中直接使用用户名和密码是非常危险的。你不应该把证书放在配置文件中。其次将凭证作为命令行参数传递给构建器也不是一个好主意,因为它需要一直传递凭证,而且密码可能被保存在bash历史记录或其他日志中。首选的解决方案是使用部署密钥。一组专门用于只读访问某些资源库的ssh公-私密钥。你可以把这些钥匙复制到 builder 中,在 ssh 代理中注册,然后克隆软件库。由于 builder 镜像在这个过程后被删除,最终的镜像不包含任何钥匙的痕迹。
首先你需要创建一个ssh密钥对,一个给github的公钥和一个给你在docker文件中使用的私钥。在Linux上只要运行ssh-keygen -t rsa -f github_key就可以生成一个RSA密钥对。然后为了方便可以把github_key和github_key.pub文件复制保存到你的Dockerfile所在的位置。
# 生成一个RSA密钥对
ssh-keygen -t rsa -f github_key
在Windows上,PuTTY/KiTTY可以生成密钥对,确保以OpenSSH格式导出私钥。
接下来,你必须登录github,进入到你仓库,setting → Deploy keys,然后添加密钥。
上传你的公钥github_key.pub的内容并保存修改。
现在我们只需要把github_key复制到builder镜像中,
启动ssh-agent,
把钥匙添加到agent中,
从github.com导入公钥,
最后用ssh而不是https来克隆镜像。
# baseon node image
FROM node as builder
# 拷贝密钥
COPY github_key .
# 启动ssh-agent、把密钥添加到anget、从github.com导入公钥、通过ssh方式完成克隆git项目
RUN eval $(ssh-agent) && \
ssh-add github_key && \
ssh-keyscan -H github.com >> /etc/ssh/ssh_known_hosts && \
git clone git@github.com:phillies/vue_example.git /opt/vue_example
# 安装创建项目
WORKDIR /opt/vue_example
RUN npm install && npm run build
# baseon nginx
FROM nginx
# 拷贝builder镜像中的最终打包目录发布到nginx中
COPY --from=builder /opt/vue_example/dist/ /usr/share/nginx/html/
EXPOSE 80
这样。可用于任何类型的git项目,也可用于其他git主机,只要它们支持ssh登录。