[software development] 本地利用docker镜像实现arm64、longarch64包构建环境搭建
Tofloor
poster avatar
yanjuner
Super Moderator
2023-10-26 18:03
Author

安装docker

sudo apt-get install -y docker.io docker-compose
sudo apt-get install -y docker-ce docker-ce-cli
# qemu-user-static 用来模拟多平台环境,它依赖于binfmt-support,所以这两者都要安装。
sudo apt-get install -y qemu-user-static binfmt-support
# 通知Docker使用qemu
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

创建Buildx构建容器

激活客户端的实验属性配置:
export DOCKER_CLI_EXPERIMENTAL=enabled

激活服务端的实验属性配置:/etc/docker/daemon.json中添加配置

{
   "experimental": true 
}

执行

systemctl daemon-reload
systemctl restart docker.service

一个Dockerfile示例

FROM --platform=$TARGETPLATFORM debian:10
MAINTAINER "testok"
RUN ["/bin/bash", "-c", "echo hello"]
ADD rootfs.tgz /
CMD ["/bin/bash", "-c", "echo hello testok"]
WORKDIR /

用uos镜像打包一个arm容器用于编译环境

  1. 提取镜像中的文件系统 filesystem.squashfsunsquashfs 解压得到 squashfs-root, 后再压缩 tar zcvf rootfs.tgz
  2. 进入到Dockerfile文件所在目录,编辑Dockerfile
    FROM --platform=$TARGETPLATFORM debian:10
    MAINTAINER "testok"
    RUN ["/bin/bash", "-c", "echo hello"]
    ADD rootfs_arm64.tgz /
    CMD ["/bin/bash", "-c", "echo hello testok"]
    WORKDIR /
    
  3. 执行 docker buildx build -t name:tag --platform linux/arm64 . --load
  4. 使用 docker cp 工程目录 containerid:/镜像里的路径
  5. docker镜像迁移、异机使用参考save参数和load参数用法

loongarch 架构的支持

默认qemu的配置中,是不支持 loongarch 架构的, 所以如果镜像的架构是 loongarch 的话,那需要另外注册

  1. 下载 qemu-loongarch64-static,放到 /usr/bin 目录 qemu-loongarch64-static
    wget https://gitee.com/michael0066/qemu-loongarch64-static/raw/master/qemu-loongarch64-static
    
  2. 注册 loongarch
    
    echo ":qemu-loongarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x01:\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-loongarch64-static:" > /proc/sys/fs/binfmt_misc/register
    

检查是否注册成功
cat /proc/sys/fs/binfmt_misc/qemu-loongarch

cat /proc/sys/fs/binfmt_misc/qemu-mips64el
板式相似

3. 编辑Dockerfile
```Dockerfile
FROM --platform=$TARGETPLATFORM loongsongd/debian10_loongarch64_x64:e15.0
MAINTAINER "testok"
RUN ["/bin/bash", "-c", "echo hello"]
ADD rootfs_loonarch64.tgz /
CMD ["/bin/bash", "-c", "echo hello testok"]
WORKDIR /
  1. 执行 docker buildx build -t name:tag --platform linux/loongarch64 . --load

常用的docker命令

# 将镜像保存为本地tar文件
docker load -o/home/dtx/demo-1.tar
docker save imageid > /root/demo-1.tar

# 载入镜像
docker load -i /home/dtx/demo-1.tar
docker load < /root/demo-1.tar

# 运行一个容器
docker run --network=host -itd name:tag /bin/bash
docker exec -it containerid /bin/bash

# 提交镜像,新的镜像名称为name,版本为tag 
docker commit containerid name:tag

# 查看正在运行的docker容器
docker ps

# 停止正在运行的容器
docker stop containerid

# 删除停止运行的容器
docker rm containerid

# 删除docker镜像
docker rmi imageid
Reply Favorite View the author
All Replies
TSAC
deepin
2023-10-26 18:16
#1

thanks

Reply View the author
阿尼樱奈奈
Moderator
2023-10-26 18:23
#2

like

Reply View the author
jjcui8595
Moderator
2023-10-26 18:56
#3

厉害like

Reply View the author