指点成金-最美分享吧

登录

docker中启用buildx

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了docker中启用buildx相关的知识,希望对你有一定的参考价值。

参考技术A 添加

最后结果

运行

开启buildx 功能
默认情况下,buildx已经在安装包里面了
在 ~/.docker/config.json增加,是家目录的client端的配置不是/etc下的配置
"experimental": "enabled"
即可永久开启buildx命令
为了良好的支持性,如果是centos版本需要升级内核到5.12.9才能正常使用
内核升级过程(略)

使用buildx 功能
在 Docker 19.03+ 版本中可以使用 docker buildx build 命令使用 BuildKit 构建镜像。该命令支持--platform 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。

1、由于 Docker 默认的 builder 实例不支持同时指定多个 --platform ,我们必须首先创建一个新的 builder 实例。

2、使用新创建好的builder实例

3、查看已有的builder实例

4、安装模拟器(用于多平台镜像构建)

5、本地构建镜像并推送

如果buildx中需要本机网络则需要network=host
network=host 被认为是不安全的,您需要在创建构建器时传递 --buildkitd-flags "--allow-insecure-entitlement network.host",示例如下:

https://www.51cto.com/article/678858.html
提供了一种解决方法

配置后记得重启docker

如何在 docker 中成功启用 udev 同步?

【中文标题】如何在 docker 中成功启用 udev 同步?【英文标题】:How can enable udev sync successfully in docker? 【发布时间】:2015-07-24 10:26:22 【问题描述】:

我已经从这个site 下载并安装了静态链接的docker 1.6.1,并在RHEL 7.1 上运行它:

[root@localhost bin]# ./docker -dWARN[0000] Udev sync is not supported. This will lead to unexpected behavior, data loss and errorsINFO[0000] +job init_networkdriver()INFO[0000] +job serveapi(unix:///var/run/docker.sock)INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)INFO[0000] -job init_networkdriver() = OK (0)INFO[0000] Loading containers: start.INFO[0000] Loading containers: done.INFO[0000] docker daemon: 1.6.1 97cd073; execdriver: native-0.2; graphdriver: devicemapperINFO[0000] +job acceptconnections()INFO[0000] -job acceptconnections() = OK (0)INFO[0000] Daemon has completed initialization

我可以看到有一个警告:“Udev sync is not supported. This will lead to unexpected behavior, data loss and errors”,在查看docker源代码后,我发现警告日志来自deviceset.go:

func (devices *DeviceSet) initDevmapper(doInit bool) error     ......    // https://github.com/docker/docker/issues/4036    if supported := devicemapper.UdevSetSyncSupport(true); !supported         log.Warnf("Udev sync is not supported. This will lead to unexpected behavior, data loss and errors")        log.Debugf("devicemapper: udev sync support: %v", devicemapper.UdevSyncSupported())    ......

devicemapper.UdevSetSyncSupport是这样的:

// UdevSyncSupported returns whether device-mapper is able to sync with udev//// This is essential otherwise race conditions can arise where both udev and// device-mapper attempt to create and destroy devices.func UdevSyncSupported() bool     return DmUdevGetSyncSupport() != 0// UdevSetSyncSupport allows setting whether the udev sync should be enabled.// The return bool indicates the state of whether the sync is enabled.func UdevSetSyncSupport(enable bool) bool     if enable         DmUdevSetSyncSupport(1)     else         DmUdevSetSyncSupport(0)        return UdevSyncSupported()

我可以看到原因是启用udev 同步失败。如何使udev同步成功?

更新:查看dm_udev_set_sync_support的反汇编代码后:

(gdb) disassemble dm_udev_set_sync_supportDump of assembler code for function dm_udev_set_sync_support:=> 0x0000000000a3e4e0 <+0>:     repz retqEnd of assembler dump.

它是一个空函数,什么都不做,更不用说设置同步支持。这是否意味着这个静态构建的 docker 二进制文件没有用?

【问题讨论】:

【参考方案1】:

我无法重现您的问题;我得到以下信息:

(gdb) disassemble dm_udev_set_sync_supportDump of assembler code for function dm_udev_set_sync_support@plt:   0x0000000000403420 <+0>:     jmpq   *0xda8c92(%rip)        # 0x11ac0b8    0x0000000000403426 <+6>:     pushq  $0x14   0x000000000040342b <+11>:    jmpq   0x4032d0

帮自己一个忙:忽略 docker.io 所做的构建,直接从 RHEL 获取 Docker。它在附加频道中可用。虽然它通常会比上游版本晚几周(例如 1.6 而不是 1.7),但它也经过了良好的测试并保证可以实际工作。

【讨论】:

【参考方案2】:

在一些有用的反馈后修改我的原始答案:

您必须使用动态二进制文件:“问题当然是静态链接的二进制文件,udev 同步是不可能的,因此可能会导致损坏问题。这对于 RedHat(维护 devicemapper 驱动程序)来说很难确定,因为他们使用动态链接的二进制文件(他们在他们的存储库中提供)。

就在 1.7.0 版本之后,docker 开始为 rpms 和 debs 提供来自主安装脚本 @get.docker.com 的动态链接二进制文件(以及匹配的 repos)。这些二进制文件支持 udev 同步,并且 devicemapper 应该可以正常工作。”

幸运的是,自从 OP 创建以来,Docker 已更改其存储库以提供动态二进制文件。

参考:https://github.com/docker/docker/issues/13179

【讨论】:

以上是关于docker中启用buildx的主要内容,如果未能解决你的问题,请参考以下文章