首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Docker -不能用docker buildx构建多平台映像

Docker -不能用docker buildx构建多平台映像
EN

Stack Overflow用户
提问于 2020-02-05 16:36:56
回答 4查看 13K关注 0票数 17

我正在尝试使用docker构建一个多平台(amd64、arm64和armv7)映像。由于我使用的是运行Ubuntu18.04的amd64机器,所以我按照码头网站上的说明安装了qemu

sudo apt install qemu-user

但是,当我执行前面的命令时,会出现一个奇怪的错误。更具体地说,binfmt-support服务似乎存在问题。下面是完整的日志:

代码语言:javascript
运行
复制
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Starting pkgProblemResolver with broken count: 0
Starting 2 pkgProblemResolver with broken count: 0
Done
The following additional packages will be installed:
  binfmt-support qemu-user-binfmt
The following NEW packages will be installed:
  binfmt-support qemu-user qemu-user-binfmt
0 upgraded, 3 newly installed, 0 to remove and 1 not upgraded.
Need to get 0 B/7.409 kB of archives.
After this operation, 63,4 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
Selecting previously unselected package binfmt-support.
(Reading database ... 245278 files and directories currently installed.)
Preparing to unpack .../binfmt-support_2.1.8-2_amd64.deb ...
Unpacking binfmt-support (2.1.8-2) ...
Selecting previously unselected package qemu-user.
Preparing to unpack .../qemu-user_1%3a2.11+dfsg-1ubuntu7.21_amd64.deb ...
Unpacking qemu-user (1:2.11+dfsg-1ubuntu7.21) ...
Selecting previously unselected package qemu-user-binfmt.
Preparing to unpack .../qemu-user-binfmt_1%3a2.11+dfsg-1ubuntu7.21_amd64.deb ...
Unpacking qemu-user-binfmt (1:2.11+dfsg-1ubuntu7.21) ...
Setting up binfmt-support (2.1.8-2) ...
Job for binfmt-support.service failed because the control process exited with error code.
See "systemctl status binfmt-support.service" and "journalctl -xe" for details.
invoke-rc.d: initscript binfmt-support, action "start" failed.
● binfmt-support.service - Enable support for additional executable binary formats
   Loaded: loaded (/lib/systemd/system/binfmt-support.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Wed 2020-02-05 17:20:29 CET; 4ms ago
     Docs: man:update-binfmts(8)
  Process: 7766 ExecStart=/usr/sbin/update-binfmts --enable (code=exited, status=2)
 Main PID: 7766 (code=exited, status=2)

feb 05 17:20:29 XPS-15-9570 systemd[1]: Starting Enable support for additional executable binary formats...
feb 05 17:20:29 XPS-15-9570 update-binfmts[7766]: update-binfmts: warning: unable to close /proc/sys/fs/binfmt_misc/register: No such file or directory
feb 05 17:20:29 XPS-15-9570 update-binfmts[7766]: update-binfmts: exiting due to previous errors
feb 05 17:20:29 XPS-15-9570 systemd[1]: binfmt-support.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
feb 05 17:20:29 XPS-15-9570 systemd[1]: binfmt-support.service: Failed with result 'exit-code'.
feb 05 17:20:29 XPS-15-9570 systemd[1]: Failed to start Enable support for additional executable binary formats.
Setting up qemu-user (1:2.11+dfsg-1ubuntu7.21) ...
Setting up qemu-user-binfmt (1:2.11+dfsg-1ubuntu7.21) ...
update-binfmts: warning: current package is qemu-user-binfmt, but binary format already installed by qemu-user-static
update-binfmts: exiting due to previous errors
dpkg: error processing package qemu-user-binfmt (--configure):
 installed qemu-user-binfmt package post-installation script subprocess returned error exit status 2
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
Processing triggers for neon-settings (0.0+p18.04+git20191212.1343) ...
Processing triggers for systemd (237-3ubuntu10.33) ...
Errors were encountered while processing:
 qemu-user-binfmt
E: Sub-process /usr/bin/dpkg returned an error code (1)

尽管如此,我还是继续按照惯例行事,即:

代码语言:javascript
运行
复制
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx inspect --bootstrap

其中,最后一个命令的输出是:

代码语言:javascript
运行
复制
[+] Building 5.0s (1/1) FINISHED                                                                                                                                                             
 => [internal] booting buildkit                                                                                                                                                         5.0s
 => => pulling image moby/buildkit:buildx-stable-1                                                                                                                                      4.3s
 => => creating container buildx_buildkit_mybuilder0                                                                                                                                    0.7s
Name:   mybuilder
Driver: docker-container

Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64, linux/386

如您所见,“linux/ and 64”和"linux/386“是唯一可用的平台,但是我也需要为"linux/arm64”和"linux/arm/v7“平台构建映像。几个小时以来,我一直在寻找解决这个问题的方法,尽管我没有找到有效的解决办法。

看来我可以通过运行以下命令来解决部分问题:

代码语言:javascript
运行
复制
sudo apt purge --auto-remove qemu-user qemu-user-binfmt binfmt-support

然后重新安装。实际上,再次运行以下命令:

代码语言:javascript
运行
复制
sudo apt install qemu-user

一点也不出错:

代码语言:javascript
运行
复制
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Starting pkgProblemResolver with broken count: 0
Starting 2 pkgProblemResolver with broken count: 0
Done
The following additional packages will be installed:
  binfmt-support qemu-user-binfmt
The following NEW packages will be installed:
  binfmt-support qemu-user qemu-user-binfmt
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/7.409 kB of archives.
After this operation, 63,4 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
Selecting previously unselected package binfmt-support.
(Reading database ... 245437 files and directories currently installed.)
Preparing to unpack .../binfmt-support_2.1.8-2_amd64.deb ...
Unpacking binfmt-support (2.1.8-2) ...
Selecting previously unselected package qemu-user.
Preparing to unpack .../qemu-user_1%3a2.11+dfsg-1ubuntu7.21_amd64.deb ...
Unpacking qemu-user (1:2.11+dfsg-1ubuntu7.21) ...
Selecting previously unselected package qemu-user-binfmt.
Preparing to unpack .../qemu-user-binfmt_1%3a2.11+dfsg-1ubuntu7.21_amd64.deb ...
Unpacking qemu-user-binfmt (1:2.11+dfsg-1ubuntu7.21) ...
Setting up binfmt-support (2.1.8-2) ...
Created symlink /etc/systemd/system/multi-user.target.wants/binfmt-support.service → /lib/systemd/system/binfmt-support.service.
Setting up qemu-user (1:2.11+dfsg-1ubuntu7.21) ...
Setting up qemu-user-binfmt (1:2.11+dfsg-1ubuntu7.21) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
Processing triggers for neon-settings (0.0+p18.04+git20191212.1343) ...
Processing triggers for systemd (237-3ubuntu10.38) ...

同样,systemctl status binfmt-support.service的输出也如预期的那样:

代码语言:javascript
运行
复制
● binfmt-support.service - Enable support for additional executable binary formats
   Loaded: loaded (/lib/systemd/system/binfmt-support.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mon 2020-02-10 11:42:23 CET; 1min 11s ago
     Docs: man:update-binfmts(8)
 Main PID: 7161 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/binfmt-support.service

feb 10 11:42:23 XPS-15-9570 systemd[1]: Starting Enable support for additional executable binary formats...
feb 10 11:42:23 XPS-15-9570 systemd[1]: Started Enable support for additional executable binary formats.

但是,部分问题仍然存在,因为运行以下三个命令后的输出:

代码语言:javascript
运行
复制
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx inspect --bootstrap

与以前相同,即:

代码语言:javascript
运行
复制
[+] Building 2.6s (1/1) FINISHED                                                                                                                                                             
 => [internal] booting buildkit                                                                                                                                                         2.6s
 => => pulling image moby/buildkit:buildx-stable-1                                                                                                                                      2.0s
 => => creating container buildx_buildkit_mybuilder0                                                                                                                                    0.6s
Name:   mybuilder
Driver: docker-container

Nodes:
Name:      mybuilder0
Endpoint:  unix:///var/run/docker.sock
Status:    running
Platforms: linux/amd64, linux/386

为什么会这样呢?为什么它让我看到linux/amd64linux/386是唯一可用的平台?

编辑#2 (关于@LinPy的评论)

docker context ls的输出是:

代码语言:javascript
运行
复制
NAME                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default *           Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm

在qemu安装之后,我也尝试重新启动了docker,但是没有成功。另外,在docker命令中指定目标平台:

代码语言:javascript
运行
复制
docker buildx build -t <mytag> --platform linux/amd64,linux/arm64,linux/arm/v7 --load .

导致此错误:

代码语言:javascript
运行
复制
[+] Building 0.6s (5/20)                                                                                                      
 => [internal] load .dockerignore                                                                                        0.0s
 => => transferring context: 2B                                                                                          0.0s
 => [internal] load build definition from Dockerfile                                                                     0.0s
 => => transferring dockerfile: 32B                                                                                      0.0s
 => [linux/arm/v7 internal] load metadata for docker.io/alegeno92/opencv_python3:3.4.2                                   0.6s
 => CANCELED [linux/arm64 internal] load metadata for docker.io/alegeno92/opencv_python3:3.4.2                           0.6s
 => CANCELED [linux/amd64 internal] load metadata for docker.io/alegeno92/opencv_python3:3.4.2                           0.6s
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to load LLB: runtime execution on platform linux/arm/v7 not supported

顺便说一下,我的内核版本是4.15.0-76-generic

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-13 08:56:33

先运行多拱容器

代码语言:javascript
运行
复制
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx rm builder
docker buildx create --name builder --driver docker-container --use
docker buildx inspect --bootstrap

你应该有你的备用架构。

票数 47
EN

Stack Overflow用户

发布于 2021-10-08 08:37:12

在这个答案上加上标签以回应第一个错误。每个https://docs.docker.com/buildx/working-with-buildx/都更新了这些命令。

QEMU是一个跨平台模拟器,负责为不同的体系结构(通过binfmt_misc处理程序)寻找二进制文件。

将为一些人节省一些时间,以便首先使用此命令:

代码语言:javascript
运行
复制
docker run --privileged --rm tonistiigi/binfmt --install all
票数 2
EN

Stack Overflow用户

发布于 2022-02-16 14:41:46

有多个binfmt包,当问到这个问题时,我认为有一个配置被遗漏了。

对于各种包,我会选择qemu-user-static而不是qemu-user-binfmt,以避免任何动态链接问题。这两个包在做相同的事情,所以您需要选择一个或另一个。

下一部分应该在当前版本中修复,但我认为您之前遇到过这个问题。这是fix binaryF标志,您将在/proc/sys/fs/binfmt_misc中显示文件,例如,请参见此处的F标志:

代码语言:javascript
运行
复制
$ cat /proc/sys/fs/binfmt_misc/qemu-arm
enabled
interpreter /usr/libexec/qemu-binfmt/arm-binfmt-P
flags: POCF
offset 0
magic 7f454c4601010100000000000000000002002800
mask ffffffffffffff00fffffffffffffffffeffffff

有关F标志意味着什么的详细信息可以在这个kernel.org帖子上找到,但是缺少容器名称空间包括一个不同的文件系统名称空间,尝试从该名称空间访问解释器将失败(除非您将/usr/libexec/qemu-binfmt绑定到容器中)。新版本的qemu包会自动设置此标志,因此,如果您的标志部分没有定义F,请参阅这些bug报告中您需要升级到的版本:

简单的按钮是使用来自多拱图像的二进制文件。如果您有一个专用的VM,这在CI中是很好的(如果您正在修改其他构建所使用的主机,则不太理想)。但是,如果您重新启动,它会中断,直到您再次运行容器。它要求你记住更新它的任何上游补丁。因此,我不推荐它作为一个长时间运行的构建主机。

代码语言:javascript
运行
复制
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60080264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档