在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像。该命令支持 --platform 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。

安装模拟器

Docker for Linux 不支持构建 arm 架构镜像,我们可以运行一个新的容器让其支持该特性,Docker 桌面版无需进行此项设置。

docker run --rm --privileged tonistiigi/binfmt:latest --install all

新建 builder 实例

由于 Docker 默认的 builder 实例不支持同时指定多个 --platform,所以必须先创建一个新的 builder 实例。同时由于国内拉取镜像较缓慢,我们可以使用配置了 镜像加速地址 的 dockerpracticesig/buildkit:master 镜像替换官方镜像。

 
# 适用于国内环境
 
docker buildx create --use --name=mybuilder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
   
 
# 官方默认
 
docker buildx create --name mybuilder --driver docker-container

上面新建了一个名为 mybuilder 的实例,可以使用 docker buildx ls 查看

使用新创建好的 builder 实例

docker buildx use mybuilder

新建 Dockerfile 文件

以下是一个示例的 Dockerfile 文件,用于构建自定义 Nginx 容器镜像:

 
FROM --platform=$TARGETPLATFORM nginx
 
LABEL org.opencontainers.image.authors="Kinoko"
   
 
RUN apt update \
 
&& apt install cron -y \
 
&& curl https://get.acme.sh | sh -s email=admin@example.com \
 
&& ln -s /root/.acme.sh/acme.sh /usr/bin/acme.sh \
 
&& chmod +x /usr/bin/acme.sh \
 
&& acme.sh --upgrade --auto-upgrade
   
 
EXPOSE 80 443
 
USER root

$TARGETPLATFORM 是内置变量,由 --platform 参数来指定其值。

由于是基于 nginx 镜像制作,nginx支持以下7种系统架构,因此我们制作的镜像也就跟着支持这 7 种系统架构。

linux/386,linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/ppc64le,linux/s390x

如果基础镜像来源于不同的镜像,可以先将不同的基础镜像进行重命名,使用统一的前缀和不同的 tag 来区分,然后在 Dockerfile 中使用变量 TARGETARCH 来选择不同的基础镜像。

构建镜像

使用 docker buildx build 命令构建镜像,注意将 myusername 替换为自己的 Docker Hub 用户名。$TARGETPLATFORM 是内置变量,由 --platform 参数来指定其值。

 
docker buildx build --platform linux/386,linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7,linux/ppc64le,linux/s390x -t myusername/nginx:tag . --push
 
docker buildx imagetools inspect myusername/nginx:tag

--push 会将构建好的镜像推送到镜像仓库

--load 会将构建好的镜像load到本地,不支持多镜像一起使用,需要分开构建

参考

  1. 使用 buildx 构建多种系统架构支持的 Docker 镜像
  2. 使用 Docker Buildx 构建多种系统架构镜像

Docker 使用 buildx 构建多种系统架构支持的镜像的更多相关文章

  1. 使用 buildx 构建多平台 Docker 镜像

    原文链接:使用 buildx 构建多平台 Docker 镜像 在工作和生活中,我们可能经常需要将某个程序跑在不同的 CPU 架构上,比如让某些不可描述的软件运行在树莓派或嵌入式路由器设备上.特别是 D ...

  2. 使用 Spring Cloud 和 Docker 构建微服务架构

    如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构. 本文通过使用Spring Boot.Spring Cloud和Docker构 ...

  3. Docker Buildx使用教程:使用Buildx构建多平台镜像

    写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker ...

  4. Kubernetes的系统架构与设计理念

    Kubernetes与云原生应用简介 随着Docker技术的发展和广泛流行,云原生应用和容器调度管理系统也成为IT领域大热的词汇.事实上,云原生应用的思想,在Docker技术火爆之前,已经由云计算技术 ...

  5. 千万pv大型web系统架构,学习从点滴开始

     架构,刚开始的解释是我从知乎上看到的.什么是架构?有人讲, 说架构并不是一 个很 悬 乎的 东西 , 实际 上就是一个架子 , 放一些 业务 和算法,跟我们的生活中的晾衣架很像.更抽象一点,说架构其 ...

  6. Android系统架构说明介绍

    Android系统架构说明介绍 Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高层到低层分别是应用程序层.应用程序框 ...

  7. Android的系统架构

    转自Android的系统架构 从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下:     1)应用程序层 ...

  8. Android进阶(十一)Android系统架构讲解

    如果说一个成功男人的背后会有一个默默支持的女人的话,那么一个优越稳定的平台背后必有一个成熟的系统架构所支撑着.那么,Android的系统架构是怎么样的呢?从下图我们可以从整体上有个大致的了解(图片来源 ...

  9. Android进阶加密-第1章-Android系统架构-读书笔记

    第 1 章 Android 系统架构 1.1 Android 系统架构 Android 系统架构分为五层,从上到下依次是应用层.应用框架层.系统运行库层.硬件抽象层和 Linux 内核层. 应用层(S ...

  10. Android系统架构及内核简介

    (来源于ThinkPHP) Android是Google公司开发的基于Linux平台的开源手机操作系统,它包括操作系统.中间件.用户界面和应用程序,而且不存在任何以往阻碍移 动产业创新的专利权障碍,并 ...

随机推荐

  1. 将nii文件CT图像更改窗宽窗位之后保存成nii文件

    因为项目需要把CT图像中骨头更加明确的显示出来,且还需要保存nii文件,所以查了一些资料,在这里做一下笔记,方便以后使用.代码如下: import nibabel as nib import nump ...

  2. 买游戏本玩战锤40K ?ToDesk云电脑教你2元升级旧电脑,省钱!

    <战锤40K:星际战士>终于出续作了!不得不说这款多人射击游戏的热度实在太高啦,刚发布两天就登顶Steam销量第一名. <战锤40K:星际战士2>不仅继承了前作的精髓,更在画面 ...

  3. C# 13(.Net 9) 中的新特性 - 半自动属性

    C# 13 即 .Net 9 按照计划会在2024年11月发布,目前一些新特性已经定型,今天让我们来预览其中的一个新特性: 作者注:该特性虽然随着 C# 13 发布,但是仍然是处于 preview 状 ...

  4. STM32F103RCT6搭配“ST_LINK V2 √RoHS 'A 2023 04'”在CubeIDE中下载程序到单片机

    一.请参考本站大佬文章进行接线: ST_LINK V2接口和连接方式 二.步骤: 到此,大功告成. 小手点赞,水逆退散!!!

  5. 2023NOIP A层联测25 T4 滈葕

    2023NOIP A层联测25 T4 滈葕 配血实验与2-SAT. 思路 \(z=1\) 表示配血实验发生凝集反应,设 \(a_i,b_i\) 分别表示第 \(i\) 个人有无凝集原 A,B.(无凝集 ...

  6. 【一步步开发AI运动小程序】四、小程序如何抽帧

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...

  7. linux bash shell 入门教程()

    Shell Script(bash)简介 众所皆知地,UNIX上以小工具著名,利用许多简单的小工具,来完成原本需要大量软体开发的工作,这一点特色,使得UNIX成为许多人心目中理想的系统平台. 在众多的 ...

  8. python之常用方法(精)

    查找列表中出现最频繁的元素 使用 max() 函数可以快速查找出一个列表中出现频率最高的某个元素. >>> a = [1, 2, 3, 4, 3, 4, 5, 4, 4, 2] &g ...

  9. Linux防火墙工具之firewall

    CentOS7 的防火墙配置跟以前版本有很大区别,CentOS7这个版本的防火墙默认使用的是firewall,与之前的版本Centos 6.x使用iptables不一样 一.iptables防火墙1. ...

  10. 编译器-FIRST集合

      语法分析器的两个重要函数 FIRST和FOLLOW FIRST的定义 FIRST(α),可从α推导得到的串的首符号的集合 1.如果X是一个终结符,那么FIRST(X) = X 2.如果X是一个非终 ...