type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM

使用 Github Action 构建多平台 nginx-proxy

一直都在使用 nginx-proxy letsencrypt-nginx-proxy-companion 作为自动化的反向代理(可以自动续签证书、以及拥有服务发现的功能),但是比较烦恼的就是官方只提供了 amd64 平台的镜像,这让我这个想在树莓派上运行它的人可给苦恼坏了。所以想到了使用 Github Action 完成多平台的构建。

分析项目

下面是 nginx-proxy 的 Dockerfile,我们可以看到它依赖于 foregodocker-gen 很遗憾这两个软件也只有 amd64 的版本,而且 docker-gen 还依赖于另一个第三方依赖管理软件、巧了这个也只有 amd64 版本(我觉得我现在的头非常大),不过还好都开源,而且都是使用Go写的,这也就说我能够再次编译它实现多平台。

编写 Dockerfile

因为这次需要编译的是四个Go程序,而且还是需要协同工作的,docker-gen 依赖于 glock,nginx-proxy 依赖于 docker-genforego.一开始想出了两种解决方案

第一种解决方案

即在 Github Action 的运行镜像中直接获取相应依赖的源码进行编译,然后再根据 nginx-proxyDckerfile 进行修改后编译,想法可行,然而在进行实施的时候却遇到了问题,即无法找到相应的依赖文件,它总是去根目录下去寻找,多此更改路径也无用,最终放弃该方案。
failed to solve: rpc error: code = Unknown desc = failed to compute cache key: "/docker-gen" not found: not found

第二种方案

第二种方案就是,不使用原项目的 Dockerfile 新建一个构建使用的 Dockerfile ,前后分为两个构建阶段:第一阶段使用 golang 镜像构建所需依赖,第二阶段从第一阶段的产物中获取所需依赖,完成第二阶段的构建。golang 镜像构建完成的二进制文件默认在 /go/bin 下(当时找了挺久一直以为在 ~/go/bin)。

编写 Github Action

Github Action 为了获取最新代码,对相应的项目进行了 clone 操作,此方式可操作性极大。😉😉😉

最终成果

notion image
Github Action 获取当前时间并给 docker 镜像打标签巧用 Github Action 编译跨平台 docker 镜像