Docker Engine 23.0 发行说明

注意

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

$ 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 模块,并且仍然需要使用 “+incompatible” 版本。 在未来版本中,Go 模块兼容性的工作将继续进行。

23.0.6

2023-05-08

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

错误修复和增强功能

打包更新

23.0.5

2023-04-26

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

错误修复和增强功能

打包更新

23.0.4

2023-04-17

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

错误修复和增强功能

  • 修复 Docker CLI 23.0.0 docker/cli 中的性能回归问题 #4141
  • 修复进度指示器未按预期运行 docker/cli 的问题#4157docker cp
  • 修复 docker/cli 的 shell 补全问题 #4177docker compose --file
  • 修复了 moby/moby 中因错误处理 “default-address-pools” 而导致的错误#45246daemon.json

打包更新

23.0.3

2023-04-04

注意

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

错误修复和增强功能

  • 修复了可能导致 Swarm 加密覆盖网络的许多问题 未能履行其保证,解决 CVE-2023-28841CVE-2023-28840CVE-2023-28842
    • 现在报告缺乏对加密覆盖网络的内核支持 作为错误。
    • 加密的覆盖网络是热切建立的,而不是等待 要附加的多个节点。
    • 加密的覆盖网络现在可以在 Red Hat Enterprise Linux 9 上使用 通过使用 kernel 模块。xt_bpf
    • Swarm 叠加网络的用户应查看 GHSA-vwm3-crmr-xfxw,以确保没有发生意外暴露。

打包更新

23.0.2

2023-03-28

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

错误修复和增强功能

包装

23.0.1

2023-02-09

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

错误修复和增强功能

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

包装

23.0.0

2023-02-01

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

新增功能

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

删除

荒废的

升级

安全

错误修复和增强功能

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

已知问题

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 内联缓存 ( 跟踪问题)

尝试使用 BuildKit 的内联缓存功能(例如 , )构建镜像将导致守护进程意外退出:docker build --build-arg BUILDKIT_INLINE_CACHE=1 .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 中的某些行而导致部分缓存失效,则仍然有效和以前缓存的层将无法正确加载。

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

[+] 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

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

Kata Containers ( 跟踪问题)

23.0 分支带来了对备用 containerd 填充程序的支持,例如 (gVisor) 和 (Kata Containers)。io.containerd.runsc.v1io.containerd.kata.v2

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

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