尝试更改 docker 数据根失败 - 为什么
attempt to change docker data-root fails - why
我正在尝试将我的 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 的专家,但我在您的日志中看到了 "dirperm1 breaks the protection by the permission bits on the lower branch"。我也看到了这一点。
"drwxrwxrwx 11 jeremyr 5001 122 Mar 19 08:14 docker_data"
据我了解,docker守护进程需要目录的访问权限。 5001是指"docker"组吗?
但是,如果您 运行 root 权限中的守护程序,则不应发生这种情况。
docker_data 出了点问题。
解法:
- 删除 /etc/docker/daemon.json 文件。
- 开始docker。
- 将 /var/lib/docker 内容复制到您在 /etc/docker/daemon.json 中输入的路径。
- 放回文件 /etc/docker/daemon。json 并重新启动 docker。
TD;DR -- 在 post
之前在 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
就是这样,应该在这里完成。
Too Long版本,如果你Do想要Read:
经过一些调查,我发现了一些过时的文章,包括这篇文章,他们提到了一些自信的解决方案,这些是典型的页面:
-
add data-root
in /etc/docker/daemon.json,问题作者尝试的方法,
在大约十几个网页上阅读了这些解决方案,得到了启发:
How To Change Docker Data Folder Configuration
不是一个很好的解决方案 -- 不受欢迎,但有趣的部分在下面 更新::
graph
已在 v17.05.0
中弃用。您可以改用 data-root
。
是的,graph
=> data-root
,--graph
只是 -g
的长形式,所以我在解决方案 add -g
option in docker.service 中尝试了这个替换], 和 Ta da ~
通过
检查您机器的docker版本
docker --version
我遇到了同样的问题,将 docker 升级到可用的最新版本后问题得到解决。
甚至 docker 官方网站上的文档也没有提到类似的内容。
升级 docker 后,
通过
重启docker
systemctl restart docker
错误将消失,新的更改将开始反映。
我正在尝试将我的 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 的专家,但我在您的日志中看到了 "dirperm1 breaks the protection by the permission bits on the lower branch"。我也看到了这一点。 "drwxrwxrwx 11 jeremyr 5001 122 Mar 19 08:14 docker_data"
据我了解,docker守护进程需要目录的访问权限。 5001是指"docker"组吗?
但是,如果您 运行 root 权限中的守护程序,则不应发生这种情况。
docker_data 出了点问题。
解法:
- 删除 /etc/docker/daemon.json 文件。
- 开始docker。
- 将 /var/lib/docker 内容复制到您在 /etc/docker/daemon.json 中输入的路径。
- 放回文件 /etc/docker/daemon。json 并重新启动 docker。
TD;DR -- 在 post
之前在 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
就是这样,应该在这里完成。
Too Long版本,如果你Do想要Read:
经过一些调查,我发现了一些过时的文章,包括这篇文章,他们提到了一些自信的解决方案,这些是典型的页面:
add
data-root
in /etc/docker/daemon.json,问题作者尝试的方法,
在大约十几个网页上阅读了这些解决方案,得到了启发:
How To Change Docker Data Folder Configuration
不是一个很好的解决方案 -- 不受欢迎,但有趣的部分在下面 更新::
graph
已在v17.05.0
中弃用。您可以改用data-root
。
是的,graph
=> data-root
,--graph
只是 -g
的长形式,所以我在解决方案 add -g
option in docker.service 中尝试了这个替换], 和 Ta da ~
通过
检查您机器的docker版本docker --version
我遇到了同样的问题,将 docker 升级到可用的最新版本后问题得到解决。
甚至 docker 官方网站上的文档也没有提到类似的内容。
升级 docker 后, 通过
重启dockersystemctl restart docker
错误将消失,新的更改将开始反映。