Lazydocker 在 ARM 设备上用 Docker 运行:arm32v6/arm32v7/arm64v8 镜像怎么构建
【免费下载链接】lazydockerThe lazier way to manage everything docker项目地址: https://gitcode.com/GitHub_Trending/la/lazydocker
lazydocker 提供了用 Docker 运行的方式,但默认镜像构建面向 amd64 架构。如果你的设备是 ARM 架构(32 位 v6、32 位 v7 或 64 位 v8),直接构建会得到跑不起来的镜像,需要在构建时为不同的架构传入对应的 builder 基础镜像和 Go 交叉编译参数。README 的 Docker 安装章节 给出了三种架构各自的构建命令,构建完成后再通过挂载 docker socket 启动容器即可在 ARM 设备上使用 lazydocker。
选择与你设备匹配的构建参数
README 按架构划分了三种构建参数组合,BASE_IMAGE_BUILDER指定 builder 阶段使用的多架构 golang 基础镜像,GOARCH/GOARM控制 Go 的编译目标:
| 设备架构 | BASE_IMAGE_BUILDER | GOARCH | GOARM |
|---|---|---|---|
| ARM 32 bit v6 | arm32v6/golang | arm | 6 |
| ARM 32 bit v7 | arm32v7/golang | arm | 7 |
| ARM 64 bit v8 | arm64v8/golang | arm64 | 不传 |
Dockerfile 中这三个参数的默认值是BASE_IMAGE_BUILDER=golang、GOARCH=amd64,不传 build-arg 时构建的就是 amd64 版本;所以 ARM 设备必须显式传入上表参数。
构建 ARM 镜像
以下三条命令来自 README.md,只执行与你设备架构对应的那一条。构建上下文是仓库的 git 地址,不需要先本地 clone:
- ARM 32 bit v6 设备:
docker build -t lazyteam/lazydocker \ --build-arg BASE_IMAGE_BUILDER=arm32v6/golang \ --build-arg GOARCH=arm \ --build-arg GOARM=6 \ https://github.com/jesseduffield/lazydocker.git- ARM 32 bit v7 设备:
docker build -t lazyteam/lazydocker \ --build-arg BASE_IMAGE_BUILDER=arm32v7/golang \ --build-arg GOARCH=arm \ --build-arg GOARM=7 \ https://github.com/jesseduffield/lazydocker.git- ARM 64 bit v8 设备:
docker build -t lazyteam/lazydocker \ --build-arg BASE_IMAGE_BUILDER=arm64v8/golang \ --build-arg GOARCH=arm64 \ https://github.com/jesseduffield/lazydocker.git三条命令都把产物打名为lazyteam/lazydocker,后续运行步骤直接引用这个 tag。
运行构建好的镜像
构建完成后,按 README 的 “Run the container” 步骤启动:
docker run --rm -it -v \ /var/run/docker.sock:/var/run/docker.sock \ -v /yourpath:/.config/jesseduffield/lazydocker \ lazyteam/lazydocker两处挂载的作用:
/var/run/docker.sock挂载进容器,让 lazydocker 能访问本机的 Docker 守护进程;/yourpath是需要替换的占位符,改成一个你在宿主机上创建好的实际目录,用来存放 lazydocker 的配置(README 原文明确提醒要改成实际路径)。
带-it参数运行后,终端会进入 lazydocker 的交互式界面,退出后--rm会清理该容器实例。
如果你经常使用这个容器,README 给了一个可选的 zsh alias 写法。注意这条命令会把 alias 追加写入~/.zshrc,且其中的/yourpath/config同样要替换成你的实际配置目录:
echo "alias lzd='docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock -v /yourpath/config:/.config/jesseduffield/lazydocker lazyteam/lazydocker'" >> ~/.zshrc可选:用 docker-compose 代替手动构建
README 指出也可以使用仓库自带的 docker-compose.yml。该文件默认构建参数是 amd64:
build: context: https://github.com/jesseduffield/lazydocker.git args: BASE_IMAGE_BUILDER: golang GOARCH: amd64 GOARM:在 ARM 设备上使用时,把args改成上一节表格中与你架构对应的值(例如 v7 设备改为BASE_IMAGE_BUILDER: arm32v7/golang、GOARCH: arm、GOARM: 7),构建出的镜像 tag 同样是lazyteam/lazydocker。这个 compose 文件把宿主机的./config目录挂载为/.config/jesseduffield/lazydocker,并开启了stdin_open和tty,等价于手动docker run的挂载和交互配置。
构建参数在镜像内部如何生效
理解 Dockerfile 的结构有助于核对构建行为,它分三个阶段:
- builder 阶段:
FROM ${BASE_IMAGE_BUILDER}:${GO_VERSION}-alpine${ALPINE_VERSION},默认版本为GO_VERSION=1.23、ALPINE_VERSION=3.20。传入BASE_IMAGE_BUILDER=arm32v6/golang后,builder 实际拉取的就是arm32v6/golang:1.23-alpine3.20。编译使用CGO_ENABLED=0 GOOS=linux GOARCH=${GOARCH} GOARM=${GOARM} go build -a -mod=vendor,产物是静态的lazydocker二进制。 - docker-builder 阶段:从源码编译 Docker CLI 并随镜像分发,默认
DOCKER_VERSION=v27.0.3,GOARCH/GOARM与上面的构建参数保持一致。 - 最终阶段:
FROM scratch,把 lazydocker 放到/bin/lazydocker并设为ENTRYPOINT,Docker CLI 放在/bin/docker。
也就是说BASE_IMAGE_BUILDER决定编译器和工具链运行在哪个架构的基础镜像上,GOARCH/GOARM决定编译出的二进制目标架构,两者需要按上面的表格成对使用。
bundled docker 二进制出现兼容性问题时
镜像里自带了一个 Docker CLI 二进制,README 给出了一个已知的兼容性问题及处理方式:如果 bundled 的 Docker 二进制与宿主机版本出现兼容性问题,用下面的 build-arg 重新构建,使内置 docker 与宿主机 docker 版本一致:
--build-arg DOCKER_VERSION="v$(docker -v | cut -d" " -f3 | rev | cut -c 2- | rev)"把它追加到你所在架构的docker build命令上重新构建即可。
以上步骤完成并成功运行容器后,lazydocker 即以终端界面形式管理本机 Docker 环境;配置持久化在挂载的宿主机目录中,后续升级时重新执行对应架构的构建命令替换本地lazyteam/lazydocker镜像即可。
【免费下载链接】lazydockerThe lazier way to manage everything docker项目地址: https://gitcode.com/GitHub_Trending/la/lazydocker
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考