Docker 导入卷的图像在 Docker 上运行 mac,失败 "exec format error" 而不是 Docker CE 在 Linux
Docker image with imported volume runs on Docker for mac, fails with "exec format error" not Docker CE on Linux
我们正在 Debian 上使用 yocto 构建一个 OS 图像,它输出一个 bzip 卷,我们可以使用 docker import
在 docker 中用作基本图像,然后我们推送这个图像到我们的注册表以用作基本图像。
cp build/tmp/deploy/images/raspberrypi4/device.tar.bz2 .
docker import device.tar.bz2 registry/base_image
docker push registry/base_image
我们将基本图像作为另一个 docker 图像的一部分包含在内:
FROM registry/base_image
ADD target/app.jar app.jar
ADD docker-run.sh run.sh
ENTRYPOINT "./run.sh"
然后我们的 CI 在 linux (Amazon Linux 2) 代理上成功构建此镜像,并推送到注册表。我可以使用 Mac.
的当前版本 Docker 将图像 运行 拉到 Mac 上
但是,尝试在 linux 机器上 运行 相同的 docker 图像(即使在相同的 linux 构建代理上)会导致以下结果 exec format error
:
standard_init_linux.go:228: exec user process caused: exec format error
使用替代 docker 图像作为基础允许入口点执行,所以我很确定问题与我们的自定义基础图像有关。
由于 docker 主要是跨平台的,我很惊讶它在 MacOS(intel 和 m1)上工作,但在 Linux 上不工作(在 Ubuntu 和亚马逊 Linux)。我已经为 docker 安装尝试了 Ubuntu 和 Docker 托管的 apt 存储库。
如何进一步调试?
这里的问题是基础图像是基于手臂的,Docker Mac 可以 运行 手臂图像开箱即用,甚至英特尔机器.
https://docs.docker.com/desktop/multi-arch/
Docker Desktop provides binfmt_misc multi-architecture support, which means you can run containers for different Linux architectures such as arm, mips, ppc64le, and even s390x.
这里有一篇关于 运行ning arm docker images on linux x86 hosts 的好文章
https://matchboxdorry.gitbooks.io/matchboxblog/content/blogs/build_and_run_arm_images.html
在你的主机上安装 QEMU 后 OS,你需要挂载 QEMU 二进制文件:
docker run -it --name your-container-name -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static your-arm-image
我们正在 Debian 上使用 yocto 构建一个 OS 图像,它输出一个 bzip 卷,我们可以使用 docker import
在 docker 中用作基本图像,然后我们推送这个图像到我们的注册表以用作基本图像。
cp build/tmp/deploy/images/raspberrypi4/device.tar.bz2 .
docker import device.tar.bz2 registry/base_image
docker push registry/base_image
我们将基本图像作为另一个 docker 图像的一部分包含在内:
FROM registry/base_image
ADD target/app.jar app.jar
ADD docker-run.sh run.sh
ENTRYPOINT "./run.sh"
然后我们的 CI 在 linux (Amazon Linux 2) 代理上成功构建此镜像,并推送到注册表。我可以使用 Mac.
的当前版本 Docker 将图像 运行 拉到 Mac 上但是,尝试在 linux 机器上 运行 相同的 docker 图像(即使在相同的 linux 构建代理上)会导致以下结果 exec format error
:
standard_init_linux.go:228: exec user process caused: exec format error
使用替代 docker 图像作为基础允许入口点执行,所以我很确定问题与我们的自定义基础图像有关。
由于 docker 主要是跨平台的,我很惊讶它在 MacOS(intel 和 m1)上工作,但在 Linux 上不工作(在 Ubuntu 和亚马逊 Linux)。我已经为 docker 安装尝试了 Ubuntu 和 Docker 托管的 apt 存储库。
如何进一步调试?
这里的问题是基础图像是基于手臂的,Docker Mac 可以 运行 手臂图像开箱即用,甚至英特尔机器.
https://docs.docker.com/desktop/multi-arch/
Docker Desktop provides binfmt_misc multi-architecture support, which means you can run containers for different Linux architectures such as arm, mips, ppc64le, and even s390x.
这里有一篇关于 运行ning arm docker images on linux x86 hosts 的好文章 https://matchboxdorry.gitbooks.io/matchboxblog/content/blogs/build_and_run_arm_images.html
在你的主机上安装 QEMU 后 OS,你需要挂载 QEMU 二进制文件:
docker run -it --name your-container-name -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static your-arm-image