带有 docker 的多拱图像
大多数时候,当我开始一个项目时,我喜欢尝试在任何地方安装它来测试它。因为我有一个 Raspberry PI 集群,所以我喜欢在上面安装我的项目,看看它们是如何发展的,它们可以在哪里解决问题并解决问题。 为此,我尝试尽可能接近我的生产配置。所以我通常会放置一个 CI/CD 来测试、构建和部署我的项目。但是当谈到在常规 CI 上为 ARMv7 构建我的 Docker 映像时,它往往会变得有点复杂。您需
大多数时候,当我开始一个项目时,我喜欢尝试在任何地方安装它来测试它。因为我有一个 Raspberry PI 集群,所以我喜欢在上面安装我的项目,看看它们是如何发展的,它们可以在哪里解决问题并解决问题。
为此,我尝试尽可能接近我的生产配置。所以我通常会放置一个 CI/CD 来测试、构建和部署我的项目。但是当谈到在常规 CI 上为 ARMv7 构建我的 Docker 映像时,它往往会变得有点复杂。您需要在 CI 上提供 Qemu 以模拟目标平台。
# depending on the CI
docker run --rm --privileged hypriot/qemu-register
# or
docker run --rm --privileged multiarch/qemu-user-static:register --reset
完成后,我还想在笔记本电脑上试用该图像。因此,在 CI 上,我们必须使用相同的 Dockerfile 为不同的架构构建。
一种方法是在我们的 Dockerfile 中使用参数来指定平台。
ARG BASE_ARCH=amd64
FROM ${BASE_ARCH}/alpine
一旦完成,我“只需”在我最喜欢的 CI 上构建几次,创建一个清单并在最后阶段注释每个图像。
docker build --build-arg BASE_ARCH=amd64 -t my_image:amd64-latest .
docker build --build-arg BASE_ARCH=arm32v7 -t my_image:arm32v7-latest .
docker manifest create my_image:latest my_image:amd64-latest my_image:arm32v7-latest
docker manifest annotate --arch amd64 my_image:latest my_image:amd64-latest
docker manifest annotate --arch armv7 my_image:latest my_image:arm32v7-latest
好吧,你可以说,它很冗长。
幸运的是,Docker 团队(相对)最近在 Tech Preview 中发布了buildx。这样做是它将构建所有图像,执行清单并仅在 1 个命令中注释所有内容。
首先,我们必须从 dockerfile 中删除参数,因为它变得无用。如果我们从多架构镜像创建镜像,buildx 将管理其余部分。
docker buildx build --platform linux/arm/v7,linux/amd64 -t my_image:latest .
此时,我可以在 2 个平台中的任何一个上使用该图像,而无需使用不同的图像。
好的,现在这很好,但 buildx 仅在实验中可用,并且需要 Docker Engine 18.09+。并且根据将要使用的 CI,安装或多或少会有所不同。所以我准备了一个存储库,其中包含一个多架构构建示例,其中包含Github Actions、Circle CI、Travis CI和100210Gitlab CI 02010 1000。
更多推荐
所有评论(0)