Docker 服務在 ZFS 之前啟動

Docker 服務在 ZFS 之前啟動

我在 Ubuntu 16.04 上使用 Docker CE,並使用 ZFS 作為 Docker 的儲存。設定幾乎是標準的:

  1. 有一個 zpool 有多個磁碟
  2. 在 zpool 上,有一個帶有 mountpoint 的 zfs 檔案系統/var/lib/docker
  3. Docker 發現檔案系統是 ZFS,並且自動使用它

大多數時候一切都正常。但是,有時當我的虛擬機器啟動時,zpool 無法掛載。我相信(儘管我不是 100% 確定)這是因為 Docker 服務在掛載 ZFS 檔案系統之前啟動,事實上我看到/var/lib/docker在根 FS 上建立了一個資料夾。

如何確保在安裝所有 ZFS 檔案系統之前 Docker 服務不會啟動?

答案1

我可以透過做兩件事來解決這個問題。請注意,單獨一個可能就足夠了。

{"storage-driver": "zfs"}首先,透過在檔案中寫入來明確告訴 Docker 使用 ZFS 作為檔案系統/etc/docker/daemon.json。 (如果該檔案存在於您的磁碟中,則只需新增儲存驅動程式金鑰)

其次,在檔案中建立以下 systemd 單元/etc/systemd/system/docker-wait-zfs.service

[Unit]
Description=Wait for ZFS before starting Docker
RequiredBy=docker.service
Before=docker.service
Requires=zfs.target
After=zfs.target

[Service]
Type=oneshot
ExecStart=/bin/true
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

然後執行:

systemctl enable docker-wait-zfs.service

答案2

最近更新後,這裡的答案對我來說不起作用。看來你的“/etc/docker/daemon.json”中不能再有“{”storage-driver”:“zfs”}”,除非根驅動器使用ZFS。這不適用於我,因為我只是將資料夾對應到恰好駐留在 ZFS 上的容器。

為了解決這個問題,以下方法有效:

  1. sudo systemctl 編輯 docker.service
  2. 添加以下內容:

    After=zfs-mount.service Requires=zfs-mount.service Wants=zfs-mount.service BindsTo=zfs-mount.service

答案這裡,包含每行的作用的解釋。

相關內容