Docker 引擎 23.0 发行说明

笔记

从 Docker Engine 版本 23.0.0 开始,Buildx 分布在一个单独的包中:docker-buildx-plugin。在早期版本中,Buildx 包含在docker-ce-cli软件包中。当您升级到此版本的 Docker Engine 时,请确保更新所有软件包。例如,在 Ubuntu 上:

$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

有关升级 Docker Engine 的更多详细信息,请参阅适用于您的操作系统的Docker Engine 安装说明。

本页面介绍 Docker Engine 版本 23.0 的最新更改、添加内容、已知问题和修复。

欲了解更多信息:

从 23.0.0 版本开始,Docker Engine 不再使用 CalVer 版本控制,而是开始使用 SemVer 版本控制格式。更改版本格式是实现 Go 模块兼容性的基石,但存储库尚未使用 Go 模块,并且仍然需要使用“+不兼容”版本。在未来版本中,我们将继续努力实现 Go 模块兼容性。

23.0.6

2023-05-08

有关此版本中拉取请求和更改的完整列表,请参阅相关的 GitHub 里程碑:

错误修复和增强功能

包装更新

23.0.5

2023-04-26

有关此版本中拉取请求和更改的完整列表,请参阅相关的 GitHub 里程碑:

错误修复和增强功能

包装更新

23.0.4

2023-04-17

有关此版本中拉取请求和更改的完整列表,请参阅相关的 GitHub 里程碑:

错误修复和增强功能

包装更新

23.0.3

2023-04-04

笔记

由于 CentOS 9 Stream 的软件包存储库存在问题,CentOS 9 的软件包当前不可用。 CentOS 9 的软件包可能会在稍后添加,或者作为下一个 (23.0.4) 补丁版本的一部分。

错误修复和增强功能

  • 修复了一些可能导致 Swarm 加密覆盖网络无法兑现其保证的问题,解决了 CVE-2023-28841CVE-2023-28840CVE-2023-28842
    • 现在,缺乏对加密覆盖网络的内核支持会报告为错误。
    • 加密的覆盖网络是急切建立的,而不是等待多个节点连接。
    • 现在可以通过使用xt_bpf内核模块在红帽企业 Linux 9 上使用加密的覆盖网络。
    • Swarm 覆盖网络的用户应查看 GHSA-vwm3-crmr-xfxw, 以确保不会发生意外暴露。

包装更新

23.0.2

2023-03-28

有关此版本中拉取请求和更改的完整列表,请参阅相关的 GitHub 里程碑:

错误修复和增强功能

包装

23.0.1

2023-02-09

有关此版本中拉取请求和更改的完整列表,请参阅相关的 GitHub 里程碑:

错误修复和增强功能

  • 修复如果内核已启用 AppArmor 但apparmor_parser不可用时容器无法启动的问题。 莫比/莫比#44942
  • 修复使用内联缓存启用 BuildKit 的构建,导致守护进程崩溃。 莫比/莫比#44944
  • 修复 BuildKit 错误地加载以前版本创建的缓存层的问题。 莫比/莫比#44959
  • ipvlan修复了升级之前创建的网络会阻止守护进程启动的 问题。莫比/莫比#44937
  • 修复存储驱动程序在不支持的后备文件系统上初始化时 overlay2在早期测试中失败的问题。莫比/莫比#44922metacopy
  • 修复exec退出事件在某些运行时(例如 Kata 容器)下被误解为容器退出的问题。 莫比/莫比#44892
  • 改进了在收到由于 API 在请求中挂起而导致的 JSON 响应被截断时 CLI 返回的错误消息。 泊坞窗/cli#4004
  • runc修复尝试执行使用 Go 1.20 编译的 目录时出现的错误 CLI 退出代码。泊坞窗/cli#4004
  • 修复了将大小参数错误处理为--device-write-bps路径的问题。 泊坞窗/cli#4004

包装

23.0.0

2023-02-01

有关此版本中拉取请求和更改的完整列表,请参阅相关的 GitHub 里程碑:

新的

  • 将 Buildx 和 BuildKit 设置为 Linux 上的默认构建器。 莫比/莫比#43992
    • 别名docker builddocker buildx build. 泊坞窗/cli#3314
    • 仍然可以通过显式设置来使用旧版构建器DOCKER_BUILDKIT=0
    • BuildKit 和旧版构建器处理多阶段构建的方式存在差异。有关更多信息,请参阅 多阶段构建
  • zstd添加对拉动压缩层的 支持。莫比/莫比#41759 , 莫比/莫比#42862
  • 添加对 Linux 上备用 OCI 运行时的支持,与 containerd 运行时 v2 API 兼容。 莫比/莫比#43887 , 莫比/莫比#43993
  • 添加对 Windows 上的 containerd runhcsshim 的支持(默认情况下关闭)。 莫比/莫比#42089
  • 添加dockerd --validate以检查守护进程 JSON 配置并退出。 莫比/莫比#42393
  • 添加通过标志或 JSON 配置配置守护程序的 HTTP 代理的功能。 莫比/莫比#42835
  • 添加对 RFC 3021 点对点网络 (IPv4 /31s) 和单主机 (IPv4 /32s) 的支持。对于具有两个或更少地址的网络,IPAM 不会保留网络和广播地址。 莫比/莫比#42626
  • 添加对网络驱动程序中设置ipvlan_flag和使用的支持。 莫比/莫比#42542l3s ipvlan_modeipvlan
  • metacopy添加对显示存储驱动程序选项值的支持overlay2莫比/莫比#43557
  • 添加对使用语法描述 Windows 设备的支持IDType://ID莫比/莫比#43368
  • 添加RootlessKitslirp4netnsVPNKit版本报告。 莫比/莫比#42330
  • 添加对 SwarmKit 集群卷 (CSI) 的实验性支持。 莫比/莫比#41982
  • 添加对 SwarmKit 作业的支持docker stack deploy泊坞窗/cli#2907
  • 添加docker stack config命令以输出 .net 使用的合并和内插的配置文件stack deploy泊坞窗/cli#3544
  • 添加一个docker context show打印当前上下文名称的新命令。 泊坞窗/cli#3567
  • --format=json简写变体添加到--format="{{ json . }}"支持该标志的所有命令中--format泊坞窗/cli#2936
  • 添加一个--quiet选项docker createdocker run命令以在拉取图像时抑制输出。 泊坞窗/cli#3377
  • 向子命令添加一个--force选项docker network rm。即使网络不存在,也会导致 CLI 返回 0 退出代码。对删除网络的服务器端过程没有影响。 泊坞窗/cli#3547
  • 添加一个--signal选项到docker stopdocker restart泊坞窗/cli#3614
  • 添加一个-v/--version标志到docker-proxy. 莫比/莫比#44703
  • 当守护进程在无根模式下运行时,现在可以在众所周知的用户级路径中发现插件。 莫比/莫比#44778
  • 该守护程序现在可以优雅地处理 JSON 配置文件中常见的备用 JSON 编码,并报告有用的错误。 莫比/莫比#44777 , 莫比/莫比#44832
    • 接受带有字节顺序标记的 UTF-8。
    • 接受带有字节顺序标记的 UTF-16。
    • 无效的 UTF-8 会提前报告,并带有易于理解的错误消息。
  • 允许使用STOPSIGNALvia docker commit莫比/莫比#43369
  • 向日志驱动程序添加一个新选项awslogs,以允许跳过 CloudWatch 中的日志流创建。 莫比/莫比#42132
  • 向日志驱动程序添加新选项awslogs以指定发送到 CloudWatch 的日志格式。 莫比/莫比#42838
  • 向日志驱动程序添加一个新选项fluentd以设置重新连接间隔。 莫比/莫比#43100
  • 将新的选项设置器添加到 Go API 客户端:WithTLSClientConfigFromEnv()WithHostFromEnv()WithVersionFromEnv()莫比/莫比#42224
  • 通过子命令添加 shell 命令完成的生成docker completion泊坞窗/cli#3429
  • API:SwarmGET /_ping和添加标头HEAD /_ping,允许单请求检测 Swarm 支持。 莫比/莫比#42064
  • API:添加signal参数POST /containers/{id}/stopPOST /containers/{id}/restart来设置使用的信号。 莫比/莫比#43206
  • API:CreateMountPointPOST /containers/create. 莫比/莫比#43484
  • API:添加shared-size参数以GET /images/json启用图像的共享大小计算。 莫比/莫比#42531
  • API:type向 中添加一个参数GET /system/df,以控制计算磁盘使用情况时考虑哪些对象类型。 莫比/莫比#42559
  • systemd:使用systemd管理的containerd而不是守护进程管理的containerd。 莫比/莫比#42373
  • systemd:docker.service在 后启动time-set.target莫比/莫比#43107

已删除

已弃用

升级

安全

错误修复和增强功能

  • 提升overlay2为默认存储驱动程序(btrfs现在zfs已选择加入)。 莫比/莫比#42661
  • 将加载微调器添加到docker cp命令中。 泊坞窗/cli#2708
  • 弃用该ElectAuthServer函数,并使其返回默认注册表而不调用GET /infoAPI 端点。 泊坞窗/cli#2819
  • 回滚 Swarm 服务时进度条不再反转。 泊坞窗/cli#2940
  • 用于net.JoinHostPort()修复 IPv6 地址的格式。 泊坞窗/cli#2972
  • CLI 错误消息现在打印到stderr. 泊坞窗/cli#3044
  • 如果使用仅使用本地信息的docker info自定义,则可以提高性能。--format通过此更改,CLI 仅在检测到需要来自守护程序的信息时才使用守护程序 API。 泊坞窗/cli#3179
  • 从标志中删除默认值--stop-signal,因为它可能不反映守护程序使用的实际默认值。 泊坞窗/cli#3245
  • 将 Compose 架构添加3.10docker stack;允许省略该version字段(导致latest)。 泊坞窗/cli#3257
  • Compose 版本现在3相当于. 泊坞窗/cli#34453.xdocker stack
  • 修复了<Ctrl-c>在非交互模式下运行容器后在 Windows 上挂起以退出的问题。 泊坞窗/cli#3302
  • run-v/--volume-m/标志中添加命令的相对源路径--mount泊坞窗/cli#3469
  • docker exec -t现在在创建时立即设置执行进程的控制台大小。 泊坞窗/cli#3627
  • 更新漂亮的打印格式docker info以提供有关已安装插件的更多详细信息。 泊坞窗/cli#3645
  • 当上下文被环境覆盖时, 打印docker context list和命令的警告消息。泊坞窗/cli#3668docker context use
  • 添加aliases可用于打印命令的所有可用别名的自定义注释。 泊坞窗/cli#3694
  • docker context useCLI 在运行并选择当前上下文 时不再创建或更新 CLI 配置文件。泊坞窗/cli#3721
  • 运行时现在会忽略不存在的上下文docker context rm --force泊坞窗/cli#3791
  • 0添加在 Compose 文件中 覆盖整数的功能。泊坞窗/cli#3812
  • SIGINT ( <Ctrl-c>) 现在会传递到正在运行的容器,而不是导致 CLI 退出。 泊坞窗/cli#3849
  • 通过在打印前对端口进行排序来改善docker port CONTAINER用户体验。 泊坞窗/cli#3892
  • API:GET /containers/{id}/logs现在使用API 版本 >= 1.42 上的响应标头 POST /containers/{id}/attach报告正在使用哪种原始流格式。莫比/莫比#39812Content-type
  • 将 Windows 层的默认沙箱大小设置为 127GB,并确保该--storage-opts标志适用于 Windows 上的所有存储。 莫比/莫比#41636
  • 从 containerd 配置文件 ( ) 中删除插件部分/var/run/docker/containerd/containerd.toml莫比/莫比#41675
  • nulltar 导入期间出现 拒绝。莫比/莫比#41842
  • 为插件的自定义运行时添加垫片配置。 莫比/莫比#41854
  • 现在,当守护进程重新启动时,容器运行状况检查会恢复。 莫比/莫比#41935
  • 清理驱动程序时不再禁用配额btrfs莫比/莫比#42273
  • 现在可以将可访问的主机设备安装在--privileged无根容器中。 莫比/莫比#42638
  • **/foo修复 .中递归通配符目录模式的错误处理.dockerignore莫比/莫比#42676
  • 扩展docker import --platform以允许将导入的图像标记为外部架构。 莫比/莫比#43103
  • 现在,在守护进程启动时执行 CPU 实时选项的验证,而不是对每个单独的容器执行验证,从而允许启动提前失败。 莫比/莫比#43131
  • 冻结该namesgenerator包以防止新添加。用户必须对现有的 25359 个形容词-名称组合感到满意。 莫比/莫比#43210
  • API:containers/{id}/attach/ws仅适用于API 版本 >= 1.42 上的 stdinstdout和参数的流。莫比/莫比#43322stderr
  • 修复容器在持续流量下重新启动后容器中的 UDP 流量无法工作的问题。 莫比/莫比#43409
  • 添加对具有自定义 amd64 微架构功能级别的拉取映像的支持,最新版本的 Go、GCC、LLVM 和其他编译器工具均支持这种功能级别。 莫比/莫比#43434
  • 改进 API 中无效 JSON 请求的验证。 莫比/莫比#43463
  • exec减轻慢启动对健康检查的影响。检查超时现在仅适用于运行状况检查命令运行的持续时间。启动命令所需的时间不再计入超时。 莫比/莫比#43480
  • 控制台tty大小在创建时立即设置。 莫比/莫比#43593 , 莫比/莫比#43622
  • 修复overlay2容器启动失败或守护进程关闭后挂载未被清理的问题。 莫比/莫比#43659
  • 将清单列表分辨率与containerd. 莫比/莫比#43675
  • firewalld当守护进程以无根模式运行时, 跳过用于网络的使用。莫比/莫比#43813
  • 如果 Windows 上缺少自定义 NAT 网络,现在会在守护程序重新启动后重新创建。 莫比/莫比#43858
  • 修复了超时时终止容器运行状况检查过程的问题。 莫比/莫比#43994
  • 修复live-restore重启策略和卷参考。 莫比/莫比#44237
  • API:现在在 API 版本 >= v1.42 上默认仅修剪匿名卷。all=true除了匿名卷之外,还 可以通过过滤器来修剪命名卷。莫比/莫比#44259
  • API:支持端点并发调用GET /system/df莫比/莫比#42715
  • 提高守护进程在发送 SIGQUIT 时转储堆栈并以代码 2 退出的可靠性。 莫比/莫比#44831
  • 提高 Windows 上的可靠性docker logs -f,并防止日志驱动程序中丢失换行符local莫比/莫比#43294
  • 修复了守护进程中因容器日志缓冲而导致的罕见死锁。 莫比/莫比#44856
  • 改进杂项文件系统操作中的错误处理,以便守护进程可以在 Overlayfs 支持文件系统上启动。 莫比/莫比#44834
  • --ipc=host修复守护进程在无根模式下运行时未正确处理的 问题。莫比/莫比#44863
  • 修复了一系列长期存在的问题,其中陈旧的 conntrack 条目导致容器的 UDP 流量路由不正确。 莫比/莫比#44752
  • 修复 API 中列出的半注册容器,以及在 API 调用中使用部分注册容器导致的 nil 指针取消引用和恐慌。 莫比/莫比#44633
  • 修复创建DOCKER-USERip6tables 链失败的问题。 莫比/莫比#44845
  • ip6tables修复了命令不可用 时清理 iptables 规则失败的问题。莫比/莫比#44727
  • 修复了启用用户态代理后某些 iptables NAT 规则未清除的问题。 莫比/莫比#44811
  • 修复在极少数情况下可能泄漏的进程,其中清理启动容器的失败尝试被错误处理。 莫比/莫比#44400
  • 修复CreatedAt反映初始化而非创建的卷的时间。 莫比/莫比#44725
  • 修复了 CLI 在某些命令中错误地报告不兼容的服务器而不是无法访问的服务器的问题。 docker/cli#3901 , docker/cli#3904
  • 修复 Zsh 中卷的完成损坏问题。 泊坞窗/cli#2998
  • docker context改进存在无效上下文时 的输出。泊坞窗/cli#3847
  • 当输出不是 TTY 时,删除 CLI 帮助注释的 ANSI 修饰,并添加换行符以提高可读性。 泊坞窗/cli#3973
  • 添加docker container remove为 的别名docker container rm泊坞窗/cli#3986

已知的问题

apparmor_parser(跟踪问题)

一些 Debian 用户报告升级到 23.0 分支后容器无法启动的问题。该错误消息表明该问题是由于缺少apparmor_parser二进制文件造成的:

Error response from daemon: AppArmor enabled on system but the docker-default profile could not be loaded: running `apparmor_parser apparmor_parser --version` failed with output:
error: exec: "apparmor_parser": executable file not found in $PATH
Error: failed to start containers: somecontainer

此问题的解决方法是手动安装该apparmor软件包:

apt-get install apparmor

BuildKit 内联缓存(跟踪问题)

docker build --build-arg BUILDKIT_INLINE_CACHE=1 .尝试使用 BuildKit 的内联缓存功能(例如, )构建映像docker buildx build --cache-to type=inline .将导致守护进程意外退出:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x147ff00]

goroutine 693 [running]:
github.com/docker/docker/vendor/github.com/moby/buildkit/cache.computeBlobChain.func4.1({0x245cca8, 0x4001394960})
        /go/src/github.com/docker/docker/vendor/github.com/moby/buildkit/cache/blobs.go:206 +0xc90
github.com/docker/docker/vendor/github.com/moby/buildkit/util/flightcontrol.(*call).run(0x40013c2240)
        /go/src/github.com/docker/docker/vendor/github.com/moby/buildkit/util/flightcontrol/flightcontrol.go:121 +0x64
sync.(*Once).doSlow(0x0?, 0x4001328240?)
        /usr/local/go/src/sync/once.go:74 +0x100
sync.(*Once).Do(0x4001328240?, 0x0?)
        /usr/local/go/src/sync/once.go:65 +0x24
created by github.com/docker/docker/vendor/github.com/moby/buildkit/util/flightcontrol.(*call).wait

如果配置为在此类崩溃后执行此操作(例如通过 systemd),守护进程将重新启动。此版本中唯一可用的缓解措施是避免在启用内联缓存功能的情况下执行构建。

具有热缓存的 BuildKit(跟踪问题)

如果映像是在早期版本的守护程序上使用 BuildKit 构建的,并且是使用 23.0 守护程序构建的,则之前缓存的图层将无法正确恢复。如果 Dockerfile 中没有更改任何行,则图像可能看起来已正确构建;但是,如果由于更改 Dockerfile 中的某些行而导致部分缓存失效,则仍然有效的层和之前缓存的层将无法正确加载。

RUN在更改 Dockerfile 中的某些行后,这通常表现为应该存在于映像中的文件,而不是存在于某个阶段或引用文件的任何其他阶段中:

[+] Building 0.4s (6/6) FINISHED
 => [internal] load build definition from Dockerfile
 => => transferring dockerfile: 102B
 => [internal] load .dockerignore
 => => transferring context: 2B
 => [internal] load metadata for docker.io/library/node:18-alpine
 => [base 1/2] FROM docker.io/library/node:18-alpine@sha256:bc329c7332cffc30c2d4801e38df03cbfa8dcbae2a7a52a449db104794f168a3
 => CACHED [base 2/2] WORKDIR /app
 => ERROR [stage-1 1/1] RUN uname -a
------
 > [stage-1 1/1] RUN uname -a:
#0 0.138 runc run failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory
------
Dockerfile:5
--------------------
   3 |
   4 |     FROM base
   5 | >>> RUN uname -a
   6 |
--------------------
ERROR: failed to solve: process "/bin/sh -c uname -a" did not complete successfully: exit code: 1

为了缓解这种情况,必须丢弃以前的构建缓存。docker builder prune -a将完全清空构建缓存,并通过删除处理不当的缓存层来允许受影响的构建再次继续。

ipvlan 网络(跟踪问题)

升级到 23.0 分支时,任何ipvlan网络的存在 都会阻止守护进程启动:

panic: interface conversion: interface {} is nil, not string

goroutine 1 [running]:
github.com/docker/docker/libnetwork/drivers/ipvlan.(*configuration).UnmarshalJSON(0x40011533b0, {0x400069c2d0, 0xef, 0xef})
        /go/src/github.com/docker/docker/libnetwork/drivers/ipvlan/ipvlan_store.go:196 +0x414
encoding/json.(*decodeState).object(0x4001153440, {0x5597157640?, 0x40011533b0?, 0x559524115c?})
        /usr/local/go/src/encoding/json/decode.go:613 +0x650
encoding/json.(*decodeState).value(0x4001153440, {0x5597157640?, 0x40011533b0?, 0x559524005c?})
        /usr/local/go/src/encoding/json/decode.go:374 +0x40
encoding/json.(*decodeState).unmarshal(0x4001153440, {0x5597157640?, 0x40011533b0?})
        /usr/local/go/src/encoding/json/decode.go:181 +0x204
encoding/json.Unmarshal({0x400069c2d0, 0xef, 0xef}, {0x5597157640, 0x40011533b0})
        /usr/local/go/src/encoding/json/decode.go:108 +0xf4
github.com/docker/docker/libnetwork/drivers/ipvlan.(*configuration).SetValue(0x4000d18050?, {0x400069c2d0?, 0x23?, 0x23?})
        /go/src/github.com/docker/docker/libnetwork/drivers/ipvlan/ipvlan_store.go:230 +0x38

为了缓解这种情况,受影响的用户可以降级并删除网络,然后再次升级。或者,可以删除整个网络存储,并在升级后重新创建网络。网络商店位于/var/lib/docker/network/files/local-kv.db。如果守护程序正在使用备用路径--data-root,请替换/var/lib/docker备用路径。

Kata Containers(跟踪问题)

23.0 分支带来了对备用 Containerd 垫片的支持,例如io.containerd.runsc.v1(gVisor) 和io.containerd.kata.v2(Kata Containers)。

使用 Kata Containers 运行时时,退出会话exec会停止正在运行的容器,并在打开 TTY 时挂起连接的 CLI。除了避免执行到 Kata 运行时上运行的容器之外,目前没有其他缓解措施。

此问题的根本原因是 Moby 中长期存在的错误。这将在未来的版本中得到解决。请注意,对备用 OCI 运行时的支持是一项新功能,随着更多用户开始使用此功能,可能会发现类似的问题。