0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用预装程序创建并分发AArch64容器

安晟培半导体 来源:安晟培半导体 作者:Dave Neary 2022-09-30 10:57 次阅读

本文我们将探讨如何使用预装程序创建并分发 AArch64 容器。

创建容器

首先需要建立一个 Dockerfile。由于创建容器的目的是为小程序提供一个快速且占用资源最小的环境,因此选择 Alpine Linux 作为容器运行时。Alpine Linux 是一个小型的容器基础镜像(8MB),在容器开发中很受欢迎。初始的 Dockerfile 非常小,在获取容器镜像后,将“fizzbuzz”可执行文件从预存的构建环境第一部分复制到容器中,并将可执行文件设置为容器的入口点(当容器运行时将自动运行可执行文件):

FROM alpine:latest

WORKDIR /root/

COPY ./fizzbuzz ./

ENTRYPOINT [“./fizzbuzz”]

本次演示以 Podman 为例,其命令行与 Docker 的原理类似:

[dneary@fedora fizzbuzz-c]$ podman build -f ./Dockerfile -t fizzbuzz:1

STEP 1/4: FROM alpine:latest

STEP 2/4: WORKDIR /root/

--> Using cache

a6bfe2eb0767b7966a2e25e3f1fdd638b5a74aaf8abf2abd12f54a8f20fdf9be

--> a6bfe2eb076

STEP 3/4: COPY ./fizzbuzz ./

--> 772088bc011

STEP 4/4: ENTRYPOINT ["./fizzbuzz"]

COMMIT fizzbuzz:1

--> 4afe789ccb9

Successfully tagged localhost/fizzbuzz:1

4afe789ccb91e3ce11907a81f0b0ebbe559b65b10d9e50ff86da8a610670434d

以上步骤看似可成功运行,但当运行容器时:

[dneary@fedora fizzbuzz-c]$ podman run fizzbuzz:1

{"msg":"exec container process (missing dynamic library?) `/root//./fizzbuzz`:

No such file or directory","level":"error","time":"2022-07-11T2334.000019606Z"}

显然,运行失败了,但失败是容器开发的必经之路。

问题在于:构建在 Fedora 主机上的二进制文件被编译后要动态链接到 glibc,而 Alpine Linux 基于 Busybox 并采用 musl 的小型 libc,旨在用于桌面和服务器之外的嵌入式环境。当我们在 Alpine 中运行二进制文件时,无法找到其所需的库,于是便出现以上错误。

对于以上问题,有几个选项可以进行修正:

1. 在主机上静态链接二进制文件并复制一个嵌入了静态版本 glibc 的全包二进制文件;

2. 给 Alpine 添加一个兼容层,让它运行时动态链接到 glibc 的二进制文件;

3. 最后一项则为最优选:在 Alpine Linux 容器中构建应用程序。新 Docker 文件在 Alpine 上安装“build-base”,并复制 C 文件和 Makefile,在容器内编译 fizzbuzz。

FROM alpine:latest

WORKDIR /build/

# Install C compiler and Make

RUN apk --no-cache add build-base

COPY fizzbuzz.c Makefile ./

RUN make clean && make all

ENTRYPOINT ["./fizzbuzz"]

该方法相当简单且有效。当我们建立一个新的容器并使用 Podman 运行它时,熟悉的 FizzBuzz 输出便呈现出来。然而,当运行“podman images fizzbuzz”时,出现了以下问题:

9443a498-3fe9-11ed-b1c7-dac502259ad0.png

内存优化

由于我们安装了 GNUMake 以及整个 C 和 C++ 开发堆栈,轻量型小容器从不到 6MB 急剧扩大到了 192MB。那么是否存在一种方法将新构建的可执行文件复制回较小的镜像?

答案是肯定的:使用“多阶段构建”容器来返回到容器的上一层,并从构建环境中复制文件。使用“builder”标记构建的环境,然后将可执行文件复制到原始容器。这也使得 Dockerfile 的复杂性略有增加。

FROM alpine:latest AS builder

WORKDIR /build/

# Install C compiler and Make

RUN apk --no-cache add build-base

COPY fizzbuzz.c Makefile ./

RUN make clean && make all

FROM alpine:latest AS app

WORKDIR /root/

# Add our executable from the builder container

COPY --from=builder /build/fizzbuzz ./

ENTRYPOINT ["./fizzbuzz"]

不过镜像大小问题可以很好地得到解决:迁移到多阶段构建后,容器镜像恢复到可管理的 5.84MB:

接下来准备在 GitHub 中构建自定义运行程序。我们将使用预安装在 GitHub “ubuntu-latest” 虚拟环境上的 Docker 堆栈,并在 OCI 上的自托管 AlmaLinux 实例上使用 Podman。

将 Dockerfile 添加到存储库后,选择“添加新工作流”,GitHub Actions 将推荐“构建 Docker 容器”操作:

946ae846-3fe9-11ed-b1c7-dac502259ad0.png

我们自己的 Docker 镜像工作流程如下所示。因为在每个运行器上使用的工具链不同,所以新的工作流程文件中存在较多重复。遗憾的是,没有一种简单的方法来创建一个 build matrix,从而实现在共享其余操作的同时,还能指示不同主机使用哪个容器运行时和 Builder。

name: Docker Image CI

on:

push:

branches: [ "master" ]

pull_request:

branches: [ "master" ]

jobs:

x86-fizzbuzz-container:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v3

- name: Build the Docker image

run: docker build . --file Dockerfile --tag fizzbuzz:latest –-tag fizzbuzz:${{ github.sha }}

- name: Run the Docker image

run: docker run fizzbuzz

aarch64-fizzbuzz-container:

runs-on: [self-hosted, linux, ARM64]

steps:

- uses: actions/checkout@v3

- name: Build the Docker image with Buildah

uses: redhat-actions/buildah-build@v2

with:

image: fizzbuzz

tags: latest ${{ github.sha }}

containerfiles: |

./Dockerfile

- name: Run the Docker image

run: podman run fizzbuzz

在运行器上安装 Podman 和 Buildah 工具后,每一次推送项目到 GitHub 后,我们终于可以在本地构建容器并在两个不同的操作系统上运行。随后还可以采取一些后续措施来进行完善,比如:

在构建前将项目源目录安装到容器中;

运行一组“冒烟测试”验证最后一次提交未产生任何破坏;

构建容器后自动上传到容器注册表;

潜在地构建一个跨硬件架构容器。

不过,本文不会就构建 CI pipeline 进行介绍,我们将在今后的文章中针对基于 Ampere 处理器构建持续集成和持续交付(CI/CD)系统进行介绍。

非常感谢 Podman 社区,GitHub 贡献的大量操作文档,以及来自 Twitter 的优秀容器开发者对初学者问题的解答帮助。Ampere 持续挖掘开发社区的创造力,并将其与我们世界一流的处理器相结合。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10982

    浏览量

    206693
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21875
  • aarch64
    +关注

    关注

    0

    文章

    6

    浏览量

    4747

原文标题:创芯课堂 | 通过 Ampere® Altra® 和 GitHub Actions 构建并测试 AArch64 容器

文章出处:【微信号:AmpereComputing,微信公众号:安晟培半导体】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    谁能提供下aarch64的工具呢

    在ARM64的ubuntu里编译xr806_openharmony,其他工具链都处理好了,mkimage最后生成镜像时报错,谁能提供下aarch64的该工具,或者可以把XRADIO_mkimage的源码放出来,我自己编译下,感谢!
    发表于 12-28 06:04

    在ARMv8中aarch64aarch32是怎样进行切换的

    A64的elf程序,供fastmodel使用。如下图所示:但是对于aarch64链接器,只能将A64的.o文件,链接到一起,不能链接A32的.o文件,因此这里要用到一个小技巧,将A32
    发表于 04-01 15:09

    谈一谈在AArch64架构下内核与用户地址的隔离机制

    1、在 AArch64 架构下内核与用户地址的隔离机制一般来说在操作系统之上会有多个应用程序或者任务同时运行。每一个任务都有自己独立的页表,在进程上下文切换的过程中,也会进行页表的切换。然而,大部分
    发表于 04-13 17:27

    一文读懂ARM AArch64 state的寄存器

    表明使用SP_ELx,x表示异常级别的数字。EL0只使用SP_EL0,所以它没有h后缀。Program Count(PC,程序计数器) in AArch64 statePC:当前执行指令的地址。它是由
    发表于 05-09 09:37

    如何在x86环境下基于Qemu和Docker快速搭建AARCH64开发环境

    :ubuntu_19.04_sve 的 docker image,读者可以通过 AARCH64 开发环境准备 这一节提供的命令进入 AARCH64 开发环境。也可以通过 附录 提供的方法,手动创建开发环境。到目前为止
    发表于 07-11 15:18

    为什么aarch64和x86不像以前那样支持条件执行了呢

    为什么aarch64和x86不像以前那样支持条件执行了呢?有哪位大神可以解释一下吗
    发表于 08-01 14:12

    AArch64异常模型指南

    。是的尤其与任何编写代码以设置或管理异常的人相关。 在本指南的最后,您可以检查您的知识。您将能够列出异常级别,说明执行如何在它们之间移动,命名和描述执行状态。你还将能够详细说明一个简单的AArch64矢量表的组成部分,描述如
    发表于 08-02 06:03

    AArch64自托管调试指南

    集成在Arm核心中的调试逻辑提供了观察和控制CPU和系统环境,同时在深度嵌入式处理器上执行软件。手臂调试体系结构规范允许将调试逻辑合并到Arm体系结构中。 本指南介绍了调试,介绍了AArch64
    发表于 08-02 10:05

    AArch64外部调试详解

    用自托管调试模型正在调试。调试异常是自托管调试模型的基础。这个调试器对调试逻辑进行编程以生成调试事件。这些调试事件生成调试例外情况。您可以在我们的AArch64自托管调试指南中阅读有关此主题的内容。 当
    发表于 08-02 06:37

    Arm AArch64体系结构的可扩展矢量扩展指南

    本指南简要介绍Arm AArch64体系结构的可扩展矢量扩展(SVE)。在本指南中,您可以了解SVE的概念和主要功能,SVE的应用领域,以及SVE与Neon的比较。我们还描述了如何为支持SVE的目标开发程序
    发表于 08-10 06:43

    AArch64平台上性能下降的例子

    编者按:目前许多公司同时使用 x86 和 AArch64 2 种主流的服务器。这两种环境的算力相当,内存相同的情况下:相同版本的 JVM 和 Java 应用,相同的 JVM 参数,应用性
    的头像 发表于 09-09 11:11 2007次阅读

    kvm_arm64资料下载

    支持AArch64AArch32执行状态 ■ 32-64位互通受限于异常边界 ■ AArch64始终具有比AArch32更高的
    发表于 06-02 11:06 1次下载

    AArch64寄存器介绍

    作为 RISC 架构,AArch64 提供了大量的通用寄存器。除通用寄存器之外,本节还会介绍特殊寄存器、系统控制寄存器、处理器状态、函数调用标准。
    的头像 发表于 08-24 09:57 4888次阅读

    最新的Linux aarch64 LSA驱动程序

    电子发烧友网站提供《最新的Linux aarch64 LSA驱动程序.zip》资料免费下载
    发表于 08-23 15:46 2次下载
    最新的Linux <b class='flag-5'>aarch64</b> LSA驱动<b class='flag-5'>程序</b>

    探索aarch64架构上使用ftrace的BPF LSM

    aarch64跟x86_64的内核功能有差异。在笔者尝试定位这些差异时,看到这篇文章,可以让大家更直观地了解LSM eBPF在两种CPU 内核上的差异。
    的头像 发表于 01-25 09:30 235次阅读