我们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
:
如果为此选项分配空字符串,则要启动的命令列表将被重置,此选项的先前分配将不起作用。