【问题标题】:attempt to change docker data-root fails - why尝试更改 docker data-root 失败 - 为什么
【发布时间】:2019-03-25 19:09:45
【问题描述】:

我正在尝试将我的 docker 存储目录设置为非默认目录,这是我在其他机器上所做的:

/etc/docker/daemon.json:

{
    "data-root": "/mnt/x/y/docker_data"
}

存储目录的样子

jeremyr@snorble:~$ ls -ltr /mnt/x/y
total 4
drwxrwxrwx 11 jeremyr  5001  122 Mar 19 08:14 docker_data

使用 daemon.json 文件,sudo systemctl restart docker 命中 Job for docker.service failed(没有该 daemon.json,docker 重新启动正常,docker run hello-world 运行正常)。使用 daemon.json,journalctl -xn 显示

Mar 25 14:20:33 bolt88 systemd[1]: docker.service start request repeated too quickly, refusing to start.
Mar 25 14:20:33 bolt88 systemd[1]: Failed to start Docker Application Container Engine.
-- Subject: Unit docker.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit docker.service has failed.
-- 
-- The result is failed.
Mar 25 14:20:33 bolt88 systemd[1]: Unit docker.service entered failed state.
Mar 25 14:20:34 bolt88 sudo[23961]: jeremyr : TTY=pts/18 ; PWD=/home/jeremyr ; USER=root ; COMMAND=/bin/journalctl -xn
Mar 25 14:20:34 bolt88 sudo[23961]: pam_unix(sudo:session): session opened for user root by jeremyr(uid=0)

systemctl status docker.service 只显示code=exited, status=1/FAILURE

在 dmesg 中我看到了这个:

1547:[Mon Mar 25 14:21:41 2019] aufs au_opts_verify:1570:dockerd[20714]: dirperm1 breaks the protection by the permission bits on the lower branch
1548-[Mon Mar 25 14:21:41 2019] device veth34d1dfd entered promiscuous mode
1549-[Mon Mar 25 14:21:41 2019] IPv6: ADDRCONF(NETDEV_UP): veth34d1dfd: link is not ready
1550-[Mon Mar 25 14:21:41 2019] IPv6: ADDRCONF(NETDEV_CHANGE): veth34d1dfd: link becomes ready
1551:[Mon Mar 25 14:21:41 2019] docker0: port 1(veth34d1dfd) entered forwarding state
1552:[Mon Mar 25 14:21:41 2019] docker0: port 1(veth34d1dfd) entered forwarding state
1553:[Mon Mar 25 14:21:41 2019] docker0: port 1(veth34d1dfd) entered disabled state
1554-[Mon Mar 25 14:21:41 2019] device veth34d1dfd left promiscuous mode
1555:[Mon Mar 25 14:21:41 2019] docker0: port 1(veth34d1dfd) entered disabled state
1556-[Mon Mar 25 14:21:59 2019] systemd-sysv-generator[20958]: Ignoring creation of an alias umountiscsi.service for itself

Docker 版本 17.05.0-ce,构建 89658be,在 debian 8.8 设置上。

有谁知道为什么 docker 不允许将该目录用作数据根目录?

【问题讨论】:

    标签: docker debian


    【解决方案1】:

    TD;DR -- 发布前在 Ubuntu 18.04 上工作

    按照说明进行操作:

    sudo systemctl stop docker
    sudo rsync -axPS /var/lib/docker/ /mnt/x/y/docker_data #copy all existing data to new location
    sudo vi /lib/systemd/system/docker.service # or your favorite text editor
    

    docker.service 文件中找到这样的一行:

    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

    在其中添加--data-root /mnt/x/y/docker_data(一行):

    ExecStart=/usr/bin/dockerd --data-root /mnt/x/y/docker_data -H fd:// --containerd=/run/containerd/containerd.sock

    保存退出,然后

    sudo systemctl daemon-reload
    sudo systemctl start docker
    docker info | grep "Root Dir"
    

    最后一条命令应该输出:Docker Root Dir: /mnt/x/y/docker_data

    就是这样,应该在这里完成。


    太长版本,如果你确实阅读

    经过一番调查,我发现了一些过时的文章,包括这篇文章,他们提到了一些自信的解决方案,这些是典型的页面:

    在大约十几个网页上阅读了这些解决方案,获得了灵感:

    是的,graph => data-root,而 --graph 只是 -g 的长形式,所以我在解决方案 add -g option in docker.service 中尝试了这种替换,并且 Ta da ~

    【讨论】:

    • 真正的英雄。我知道符号链接、文件系统。我不知道为什么我找不到任何机构来处理这件事。没有任何工作。我的健全性测试是docker images,docker info 手动测试/健全性很好而且很有帮助。现在终于我的根分区没有满。谢谢!
    • 我在/etc/docker/daemon.json 中使用了data-root。没有用,但docker info 显示了正确的路径。尝试运行dockerd,一切都很好。然后我尝试再次启动该服务并且它正在工作。不知道。但是你可以试一试。我正在使用单节点集群,发现在我第一次运行时集群处于非活动状态。
    • 有趣的评论:“...第二对花括号中的所有内容都被守护程序忽略,因此您的解决方案不起作用。” github.com/moby/moby/issues/36598#issuecomment-760978285 可能是因为 JSON 不正确而无法正常工作
    • 按照这里的建议修改系统级文件是很脆弱的。它可能被任何未来的系统升级或相关更改覆盖。在最坏的情况下,它甚至可能以“裂脑”告终,如果发现得太晚,即使不是不可能,也很难修复。修改 /etc/docker/daemon.json 有效 并且是正确的解决方案。如果将文件放置到位后出现问题,则一定是其他原因。但是不建议像这样修改系统级文件。
    • @exhuma 您不能在 daemon.json 中设置已在守护程序启动时设置为标志的选项。因此,使用 /etc/docker/daemon.json 对某些发行版完全没有影响(至少对我使用 Docker 20.10.12 @Ubuntu 20.04 而言)。如果它可以像 Docker 文档中描述的那样工作,人们就不会搜索这个 SO 问题。
    【解决方案2】:

    docker_data 出现问题。

    • 解决方案:

      1. 删除 /etc/docker/daemon.json 文件。
      2. 启动泊坞窗。
      3. 将 /var/lib/docker 内容复制到您在 /etc/docker/daemon.json 中放置的路径。
      4. 放回文件 /etc/docker/daemon.json 并重新启动 docker。

    【讨论】:

    • 这不起作用。
    【解决方案3】:

    好吧,我不是 docker 专家,但我在您的日志中看到“dirperm1 通过较低分支上的权限位破坏保护”。我也看到了这一点。 “drwxrwxrwx 11 jeremyr 5001 122 Mar 19 08:14 docker_data”

    据我了解,docker daemon 需要目录的访问权限。 5001 是指“docker”组吗?

    但是,如果您以 root 权限运行守护程序,那么它不应该发生。

    【讨论】:

    • drwrwxrwx 表示每个人都有读/写权限。到那个 dir afaik,包括 docker。我实际上不确定 5001 是谁,它没有出现在 /etc/passwd 或 /etc/groups 中
    【解决方案4】:

    检查你机器的docker版本

    docker --version

    我遇到了同样的问题,将 docker 升级到可用的最新版本后问题得到了解决。

    即使是 docker 官网上的文档也没有提到类似的东西。

    升级 docker 后, 通过

    重启docker

    systemctl restart docker

    错误将消失,新的更改将开始反映。

    【讨论】:

      猜你喜欢
      • 2019-12-05
      • 1970-01-01
      • 2022-09-24
      • 2015-03-20
      • 2012-12-07
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2015-02-08
      相关资源
      最近更新 更多