首页 > 其他分享 >Docker 使用 buildx 构建多种系统架构支持的镜像

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

时间:2024-07-03 10:53:00浏览次数:13  
标签:-- buildx linux 镜像 Docker docker

在 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 protected] \
  && 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 构建多种系统架构镜像

标签:--,buildx,linux,镜像,Docker,docker
From: https://www.cnblogs.com/exmyth/p/18281185

相关文章

  • Docker alpine linux 修改时区
    Dockeralpinelinux修改时区官方解决方案如果已经在容器中#安装timezone数据包apkaddtzdata#防止添加失败,可以加上-U参数,更新仓库缓存apkadd-Utzdatals/usr/share/zoneinfocp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime#指定为上海时区echo"A......
  • Nginx proxy manager反向代理docker hub
    1.域名解析用作反向代理的域名要提前解析,如果使用外国的DNS域名提供商的话,最好提前一天解析好。2.配置NPM2.1.Details选项卡2.2.SSL选项卡2.3.Advanced选项卡location/{#Dockerhub的官方镜像仓库proxy_passhttps://regis......
  • docker离线安装及私人仓库搭建
    docker离线安装及私人仓库搭建注意文中IPPORT根据实际情况自行调整1.离线部署安装目录结构install#安装文件夹docker-19.03.9.tgz#docker安装文件压缩包docker下载地址docker-compose-linux-x86_64#docker-compose文件docker-compose下载地址daemon.json......
  • docker 常用命令速查
    启动和关闭docker服务servicedockerstartservicedockerstop查看当前所有的dockerimage文件dockerimagels查看当前所有正在运行的dockercontainerdockercontainerls构建dockerimage镜像文件dockerbuild-t<image_name>.将dockerimage文件实例化为dock......
  • 阿里云个人账号 创建docker仓库
    1、创建阿里云账号2、搜索“容器镜像服务”,进入,点击“管理控制台”3、选择个人实例,这一步可能会让你创建registry密码(如果没有创建过的话),后面登录需要4、创建命名空间5、创建镜像仓库 输入信息,点击下一步,选择本地仓库 6、进入管理页面执行相关命令 ......
  • Dockerfile语法,自定义镜像
    我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?镜像结构要想自己构建镜像,必须先了解镜像的结构。镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依......
  • 服务器上怎么部署docker
    在服务器上部署Docker主要涉及以下几个步骤,这里以UbuntuLinux为例,其他操作系统的步骤略有不同:在Ubuntu上部署Docker的步骤:1.安装Docker更新包索引:sudoaptupdate安装依赖包,以允许apt使用HTTPS访问Docker仓库:sudoaptinstall-yapt-transport-h......
  • 通俗大白话理解Docker
    什么是DockerDocker本质上是一种容器化技术,用于将应用程序及其所有依赖打包到一个标准化的单元中。这些单元(容器)可以在任何运行Docker的机器上运行。每个容器是相互隔离的,具有自己的文件系统、网络和进程空间。以下是大白话的理解,也是我在理解Docker中的一些误区:之前大......
  • BPI-M4 Berry 烧录镜像
    使用balenaEtcher烧录Linux镜像1、准备好要烧录的img,可以在香蕉派的wiki(https://docs.banana-pi.org/en/BPI-M4_Berry/BananaPi_BPI-M4_Berry#_linux_2)下载。(不需要解压,balenaEtcher能识别压缩包,并进行解压)2、下载并安装,后续要使用的软件:balenaEtcher(https://etcher.balena.io/)......
  • 聊聊gitlab ci如何构建以时间为版本号的docker镜像
    前言最近朋友他们部门有部分内部项目,打算用gitlabci来做项目持续集成部署,他们有个需求,构建docker镜像的时候,版本需要是以当前时间作为版本。其格式为yyyymmddhhmm一开始朋友翻阅官方文档,发现gitlabci有个变量CI_COMMIT_TIMESTAMP,可以生成时间戳,他默认生成的格式是ISO-8601。就......