Docker多平台、跨平台编译打包

这篇具有很好参考价值的文章主要介绍了Docker多平台、跨平台编译打包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大多数带有Docker官方标识的镜像都提供了多架构支持。如:busybox镜像支持amd64arm32v5arm32v6arm32v7arm64v8i386ppc64le, and s390x。当你在amd64设备上运行容器时,会拉取amd64镜像。

当你需要构建多平台镜像时,可以用 --platform 参数指定目标平台,但是通常情况下,你只能一次构建一个单一架构平台的镜像。如果想要一次构建多平台镜像,你需要使用docker container build driver,可以使用buildx插件进行配置,替换打包命令。

QEMU

跨平台打包可以使用QEMU,但是它比本机构建慢得多,依赖QEMU将本机指令转义为目标架构指令,从而实现跨平台编译。一般Linux kernel 4.8以后版本,支持binfmt-support 2.1.7及以上版本的平台,都能支持跨平台编译。你可以用以下步骤快速开启:

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

为不同架构平台创建本地节点,--apend可以追加到同一个构建器中:

docker buildx create --use --name mybuild node-amd64
mybuild
docker buildx create --append --name mybuild node-arm64

同时构建多平台镜像:

docker buildx build --platform linux/amd64,linux/arm64 .

这里用buildx插件代替默认build,一次打包多平台镜像,不做过多介绍。

交叉编译

docker可以轻松打包多平台的镜像,但是目标程序的交叉编译取决于开发编译环境。Golang就很容易实现交叉编译,结合docker多阶段构建技术,可以实现一次编译打包多平台镜像。

首先安装buildx插件,

下载 

 重命名并放到docker插件目录里:

mv buildx-v0.11.2.linux-amd64 docker-buildx
mkdir .docker/cli-plugins -p
mv docker-buildx .docker/cli-plugins/
chmod +x .docker/cli-plugins/docker-buildx

docker-compose也可以作为插件放到插件目录里,

mv docker-compose .docker/cli-plugins/

使用时可用如下的命令,无需使用docker-compose,这是题外话。

docker compose up -d

 其次创建构建器,

$ docker buildx ls
NAME/NODE    DRIVER/ENDPOINT             STATUS  BUILDKIT       PLATFORMS
mybuilder *  docker-container
  mybuilder0 unix:///var/run/docker.sock running v0.12.3        linux/amd64, linux/amd64/v2, linux/amd64/v3, linux/arm64, linux/riscv64, linux/ppc64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
default      docker
  default    default                     running v0.8.2+eeb7b65 linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6

ls命令列出已有的构建器,default是docker默认的构建器,mybuilder是我创建的构建器,可以用如下命令进行创建,

docker buildx create --name mybuilder --bootstrap --use

这条命令会创建mybuilder构建器,并启动,设置为默认构建器。

到这里环境就算配置好了,但是要想编译打包多平台镜像,还需要编辑Dockerfile,

FROM --platform=$BUILDPLATFORM golang:latest AS builder
ARG TARGETARCH
RUN apt-get update && apt-get install -y gcc-aarch64-linux-gnu
WORKDIR /app
COPY . .
RUN go env -w GOOS=linux GOARCH=$TARGETARCH CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct
RUN if [ "$TARGETARCH" = "arm64" ]; then go env -w AR=aarch64-linux-gnu-ar CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++; fi
RUN go mod tidy
RUN go build -a -ldflags '-extldflags "-static"' -o server main.go

FROM alpine:latest
RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk update && apk add sqlite
WORKDIR /server
RUN mkdir -p /server/data
COPY --from=builder /app/server /app/config.docker.yaml ./
COPY --from=builder /app/resource/cert ./resource/cert
EXPOSE 8660
ENTRYPOINT ./server -c config.docker.yaml

上面的Dockerfile采用多阶段构建方式支持交叉编译,多平台打包。

第一阶段进行交叉编译

第二阶段进行目标平台镜像打包

里面用到docker-container驱动的环境变量有:

BUILDPLATFORM  编译平台,即当前宿主机的平台架构

TARGETPLATFORM

BUILDARCH
TARGETARCH 目标平台架构,即多平台编译打包时的目标架构

GOARCH=$TARGETARCH 指定了Go编译目标架构 

golang:latest、alpine:latest镜像都是支持多架构的镜像,golang:latest是基于debian构建,为了交叉编译,需要安装交叉编译环境,

apt-get install -y gcc-aarch64-linux-gnu

 因为Go程序中用到了cgo特性,需要打开它

CGO_ENABLED=1

同时,如果目标平台是arm64的话,需配置go gcc等编译器环境变量

RUN if [ "$TARGETARCH" = "arm64" ]; then go env -w AR=aarch64-linux-gnu-ar CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++; fi

当然,第一步也可以直接在目标平台编译,不过速度有点洗人:

FROM --platform=$TARGETPLATFORM golang:1.21 AS builder
ARG TARGETARCH
RUN set -eux && sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list.d/debian.sources
RUN apt-get update && apt-get install -y libssl-dev g++
WORKDIR /app
COPY . .
RUN go env -w GOOS=linux GOARCH=$TARGETARCH CGO_ENABLED=1 GOPROXY=https://goproxy.cn,direct
RUN go mod tidy
RUN go build -a -ldflags '-extldflags "-static"' -o server main.go

最后,执行buildx命令

docker buildx build --platform linux/arm64,linux/amd64 -t 172.16.60.12:8888/star/iot-go . --push

编译打包多平台镜像并推送到仓库中。也可以输出单一平台,并保存到本地,

docker buildx build --platform linux/arm64 -t star/iot-go . --load

参考资料:

Multi-platform images | Docker Docs

How to use docker buildx to build multi-architecture Go images文章来源地址https://www.toymoban.com/news/detail-740913.html

到了这里,关于Docker多平台、跨平台编译打包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【QT+QGIS跨平台编译】之八:【zstd+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    【QT+QGIS跨平台编译】之八:【zstd+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    【libzstd跨平台编译】:Windows环境下编译成果(支撑QGIS跨平台编译,以及二次研发) 【libzstd跨平台编译】ÿ

    2024年01月25日
    浏览(61)
  • 【QT+QGIS跨平台编译】之五:【curl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    【QT+QGIS跨平台编译】之五:【curl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    (libcurl编译,依赖OpenSSL、libSSH2等库) curl(CommandLine Uniform Resource Locator)主要功能就是用不同的协议连接和沟通不同的服务器,相当封装了的socket。 libcurl支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可

    2024年01月23日
    浏览(55)
  • 【QT+QGIS跨平台编译】之一:【sqlite+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它

    2024年01月22日
    浏览(30)
  • 【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

    RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基于SQLite的数据库引擎,支持快速的数据查询和空间分析操作。同时,由于其轻量级的设计,RasterLite2可以

    2024年02月19日
    浏览(33)
  • 跨平台编译go(交叉编译)

    跨平台编译go(交叉编译)

    以将一个简单的go http 部署到docker为例! Dockerfile文件 docker build . -t goweb_app docker run -p 8888:8888 goweb_app 在最终的镜像中是不需要go编译器的,也就是说只需要一个运行最终二进制文件的容器即可。 Golang 支持交叉编译,在一个平台上生成另一个平台的可执行程序。 golang中跨平台

    2024年02月07日
    浏览(11)
  • ffmpeg跨平台arm编译-ubuntu

    32位系统: 64位系统: 关键选项: –arch=arm:指定ARM平台 –target-os=linux:指定Linux系统 –enable-cross-compile :指定交叉编译 –cross-prefix=arm-linux-gnueabihf-:指定交叉编译链 如果是64位系统: –arch=aarch64:指定ARM平台 –cross-prefix=aarch64-linux-gnu-:指定交叉编译链

    2024年02月08日
    浏览(35)
  • rust包跨平台编译,macbook ,linux

    在 MacBook 上编译 Rust 项目并生成 Linux 包需要一些步骤。以下是一般的步骤概述: 1. **安装所需工具:**    首先,确保您的 MacBook 上已经安装了所需的工具。您需要 Rust 编程语言的工具链以及一些用于交叉编译到 Linux 的工具。    - 安装 Rust 工具链:您可以在终端中运行以下

    2024年02月12日
    浏览(8)
  • Windows平台visual studio与树莓派跨平台交叉编译opencv

    Windows平台visual studio与树莓派跨平台交叉编译opencv

    由于架构差异,opencv在Windows平台下编译的程序无法直接移植到树莓派环境使用,所以需要进行Cmake和跨平台的交叉编译。网上包括官方文档很多足够参考,但配置过程中依然会出现个性问题,以下是本人基于windows下使用visual studio2017集成开发环境进行交叉编译环境配置过程中

    2024年04月11日
    浏览(8)
  • 最佳实践-使用Github Actions来构建跨平台容器镜像

    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 最近在写K8s的相关系列文章,因为有涉及到镜像构建,发现在Mac m1的Arm架构下构建的部分镜像,没法在X86架构下使用,不兼容。 尝试网上介绍的各种方式,都已失败告终,效果如下: 最终

    2024年02月05日
    浏览(10)
  • web前端项目使用electron打包成跨平台桌面端程序(Windows)

    web前端项目使用electron打包成跨平台桌面端程序(Windows)

    Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 在使用Electron进行开发之前,您需要安装 Node.js。 我们建

    2024年02月16日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包