如何正确更改 Docker 的默认数据目录?

如何正确更改 Docker 的默认数据目录?

我们docker-ce在一些 Ubuntu 16.04 LTS 机器上运行。这些机器有一个用于操作系统的快速 SSD,以及一个用于存储大量数据(如 docker 容器)的 ZFS 阵列。

每次我去修复 docker 设置时,似乎更新都会重置配置以使用 ZFS 阵列来存储其数据。

这可能是因为大多数指南都比较旧。我的改动,受到这篇文章的启发,就像这样:

在 中/lib/systemd/system/docker.service,添加-g "/mnt/var/lib/docker"如下内容:

ExecStart=/usr/bin/dockerd -g "/mnt/var/lib/docker" -H fd://

还推迟服务的启动,直到 ZFS 阵列上线:

[Unit]
After=network.target docker.socket firewalld.service zfs-mount.service

尽管根据文档和旧文章,这似乎是添加不同目录的推荐方法,但这一定已经过时了,因为此文件已重置每一个更新,我必须手动将其改回。重新启动服务后,它可以正常工作,直到下一次更新。

在软件包更新时使这些更改保留下来的正确方法是什么?

答案1

systemd该问题与使用文件有关。

如 中所述man file-hierarchy/lib目录用于只读供应商提供的文件,而 目录/etc用于“系统特定配置”,它可能会覆盖 中默认的供应商提供的文件/lib

放置修改的正确位置是/etc/sytemd/system

您可以用文件完全替换有问题的文件/etc/,也可以使用“插入式”模板仅覆盖文件的一部分。

搜索man systemd.unit“Drop-in”了解详情。

在软件包升级期间,中的文件/lib将继续被覆盖,但对的更改/etc/将被保留。

关于 /lib 与 /etc 的建议普遍适用,而不仅适用于systemd

systemd 插入单元示例

/etc/systemd/system/docker.service.d/10-fix-execstart.conf

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -g "/mnt/var/lib/docker" -H fd://

因此,您遵循一种模式,在以要覆盖的服务命名的目录中创建一个文件,仅声明要覆盖的特定部分和指令。

man systemd.service

如果为此选项分配空字符串,则要启动的命令列表将被重置,此选项的先前分配将不起作用。

相关内容