搭建 armv7(musl 库)容器环境

交叉编译的程序放在容器中运行

Posted by Jerry Chen on April 23, 2021

一些小知识

关于 C 库

C 库有两种实现:

  • glibc:完整、臃肿;
  • musl:精简、轻量;

关于编译器

编译器使用 glibc 库,那么编译出来的程序就依赖 glibc 库;

编译器使用 musl 库,那么编译出来的程序就依赖 musl 库;

关于 rootfs

我们知道 busybox 可以制作 rootfs,使用 musl 编译器编译 busybox 源码得到的 rootfs 是基于 musl 的,使用 glibc 编译器编译 busybox 源码的到的 rootfs 是基于 glibc 的;

大部分容器镜像都是基于 glibc 的,适用于 PC 和大内存资源丰富的嵌入式平台;

还有小部分基于 musl 的容器镜像,适用于小内存的嵌入式平台;

我们接下来的主角是 alpine 容器镜像,它是一个基于 musl 和 busybox 的 linux 发行版;

环境搭建

安装 docker

安装过程可以参考“安装 wsl2 后端的 docker-desktop 版本”;

选择平台

在 docker hub 上可以搜索到适合不同平台的 alpine,我们选择适用于 armv7 平台的版本;

交互式搭建

  1. 在控制台拉取 armv7 平台的 alpine;

    1
    
    docker pull --platform=linux/arm/v7 alpine:latest
    
  2. 创建 alpine app 并进入 /bin/sh

    使用前最好使用 -v xxx:xxx 挂载共享目录,方便主机侧和容器侧拷贝文件;

    1
    2
    
    docker run -it --name alpine_armv7 \
      --platform=linux/arm/v7 alpine:latest /bin/sh
    

    windows 平台 powershell 执行以下命令:

    1
    2
    3
    4
    
    docker run `
      -it --name alpine_armv7 `
      -v E:\DockerShare:/share `
      --platform=linux/arm/v7 alpine:latest /bin/sh
    
  3. 接着安装 libgcc 和 libstdc++

    1
    2
    3
    
    apk update
    apk add --no-cache libgcc
    apk add --no-cache libstdc++
    

[建议] 使用 dockerfile 搭建

  1. 在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:

    1
    2
    3
    4
    5
    6
    
    FROM --platform=linux/arm/v7 alpine:latest
    RUN \
      apk update \
      && apk add --no-cache libgcc \
      && apk add --no-cache libstdc++
    ENTRYPOINT ["/bin/sh"]
    
  2. 接着在该目录创建名为 myalpine 的镜像:

    1
    
    docker build -t myalpine .
    
  3. 使用该镜像创建 alpine app 并进入 /bin/sh

    使用前最好使用 -v xxx:xxx 挂载共享目录,方便主机侧和容器侧拷贝文件;

    1
    
    docker run -it --name alpine_armv7 myalpine
    

    windows 平台 powershell 执行以下命令:

    1
    2
    3
    4
    
    docker run `
      -it --name alpine_armv7 `
      -v E:\DockerShare:/share `
      myalpine