我有一台安装了 Docker 的 Ubuntu 机器。(Ubuntu 版本是 20.04,但这也影响 18.04,也可能影响非 LTS 版本。)将软件包升级docker.io
到当前版本focal-security
失败:
Preparing to unpack .../docker.io_20.10.7-0ubuntu1~20.04.1_amd64.deb ...
The aufs storage-driver is no longer supported.
Please ensure that none of your containers are
using the aufs storage driver, remove the directory
/var/lib/docker/aufs and try again.
dpkg: error processing archive /var/cache/apt/archives/docker.io_20.10.7-0ubuntu1~20.04.1_amd64.deb (--unpack):
new docker.io package pre-installation script subprocess returned error exit status 1
dpkg: error while cleaning up:
installed docker.io package post-installation script subprocess returned error exit status 1
这是一个已知错误,但该错误已被标记为“无法修复”,因为Ubuntu Docker 包装政策。
这里引用多人的话:
这是一个重大的更新变化,不应该在 LTS 版本上发生。
需要如此多手动干预的升级绝不应该在 LTS 版本中发生。
在一般情况下,您说的没错。但不幸的是,Docker 是个例外。(…)
因此,作为 Docker 的一个例外,我们更新到较新的上游版本时无需担心 Docker 本身行为的向后兼容性,而是完全依赖上游的决定。在这种情况下,仅基于其他人已经提出的分析,这意味着我们不希望自己将 aufs 存储驱动程序修补回我们的包装中。(…)
根据现行政策,这不是我们期望修复的问题,因此我将这个错误标记为“无法修复”。
我觉得这个理由很令人困惑——如果我使用的是稳定发行版,我希望升级是无缝的,我不希望拥有最新版本的程序。如果我想要滚动发布,我知道在哪里可以找到它,而且它不会被称为 LTS。但这不是讨论的场所。
我的问题是,我接下来该怎么做?我如何“确保我的容器都没有使用 aufs 存储驱动程序”?保留旧的、未维护的 Docker 版本是行不通的。我需要进行安全更新。
我的所有容器均未使用依赖于存储驱动程序的高级功能。我非常乐意升级或迁移我的容器。我该怎么做?
答案1
来自官方 Docker 文档- 如何配置您的存储驱动程序以使用OverlayFS
而不是AUFS
。
停止 Docker。
sudo systemctl stop docker
将内容复制
/var/lib/docker
到临时位置。cp -au /var/lib/docker /var/lib/docker.bk
编辑
/etc/docker/daemon.json
。如果尚不存在,请创建它。假设该文件为空,请添加以下内容。{ "storage-driver": "overlay2" }
如果 daemon.json 文件包含格式错误的 JSON,Docker 将无法启动。
启动 Docker。
sudo systemctl start docker
验证守护进程是否正在使用 overlay2 存储驱动程序。使用 docker info 命令并查找存储驱动程序和支持文件系统。
$ docker info Containers: 0 Images: 0 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true <...>
Docker 现在正在使用overlay2
存储驱动程序。
然后,您需要重新创建容器并使用新的存储驱动程序再次获取所有图像。使用“绑定挂载”映射的容器数据应保持不变(这是指向 Docker 文件系统之外的数据的挂载,而不是卷 -请参阅此处了解更多信息)。
此后,您可以删除该目录/var/lib/docker/aufs
并继续升级 Docker 包。
答案2
请注意如果你已经将数据目录移动到了其他位置(即通过data-root
中的“ ”选项) ,那么在继续安装软件包之前daemon.json
你需要删除两个 aufs 目录,一个在新目录下data-root
,另一个在/var/lib/docker