Docker(systemd)忽略默认目录(docker.service)的更改

Docker(systemd)忽略默认目录(docker.service)的更改

我想在服务器上部署docker,但我希望所有docker相关数据都放在与基础系统不同的分区中。因此,我已将上述分区挂载在“/srv”,并根据官方的文档:

这是我的‘/usr/lib/systemd/system/docker.service’文件:

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket

[Service]
Type=notify
EnvironmentFile=-/srv/docker/docker.conf
ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS
LimitNOFILE=1048576
LimitNPROC=1048576

[Install]
Also=docker.socket
WantedBy=multi-user.target

这是‘/srv/docker/docker.conf’“docker.service”文件内部引用的文件:

$OPTIONS="--graph /srv/docker --storage btrfs"

docker 守护进程正确启动,并拉取镜像。问题是它仍然没有在“/srv/docker”目录中存储任何内容。

另外,当我运行“ps -aux | grep docker”时,我得到的结果是:

root       661  0.4  0.2 351080 17044 ?        Ssl  19:33   0:00 /usr/bin/docker -d -H fd://

命令行在“fd://”处停止。在我看来,由于某种原因,“$OPTIONS”被忽略了。

现在,我引用文件的方式有问题吗?这里还有其他事情发生吗?我进行所有这些配置更改的原因是我真的希望将所有与 docker 相关的数据保存在 '/srv/docker/' 目录下。

有任何想法吗?

更新 1:

我按照答案部分的建议更改了“docker.conf”文件。现在:

$OPTIONS="--graph /srv/docker --storage btrfs"

变成:

OPTIONS="--graph /srv/docker --storage btrfs"

这导致了 docker 守护进程无法启动的(意外)后果。这是来自“systemctl status docker”的调试消息:

[root@V12 ~]# systemctl status docker ● docker.service - Docker 应用程序容器引擎 已加载:已加载(/usr/lib/systemd/system/docker.service;已启用;供应商预设:已禁用) 活动:失败(结果:退出代码) 自 2015-02-05 星期四 20:13:31 EET;14 秒前 文档:http://docs.docker.com 进程:776 ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS(code=exited,status=2)主 PID:776(code=exited,status=2)

答案1

您的文件中有错误/srv/docker/docker.conf

$OPTIONS="--graph /srv/docker --storage btrfs"

变量的规范不应该以 $ 开头;$ 应该仅在稍后使用变量时使用。

更改为:

OPTIONS="--graph /srv/docker --storage btrfs"

答案2

首先我要感谢@MichaelHampton 的回答。他的回答非常准确,我绝对不会发现“$”的拼写错误(“OPTIONS=...”而不是“$OPTIONS=...”)。

现在,问题出在命令行选项上。在 docker 文档中,更改存储驱动程序的参数如下:

--storage btrfs

请记住,这是 1.4 版的文档,也就是我拥有的版本。唉,正确的语法(如“docker --help”所示)是:

--storage-driver btrfs

因此,在进行必要的更改后,守护进程正确启动,图像被 PULL 到“/srv/docker”目录内,一切正常。

教训是永远不要对官方文档抱有太大的怀疑,尤其是像 Docker 这样正在大力开发的项目。再次感谢所有人的贡献。

答案3

最初,我花了不少时间摆弄以前的 upstart/sysv 启动脚本/etc/init.d/docker及其配置文件/etc/default/docker。奇怪的是,无论我怎么尝试,它就是不起作用,后来我意识到只需systemd忽略这两者,因为我直接使用了旧脚本。

所提出的解决方案似乎无法 100% 地在我的 15.04 上lxc-docker-1.7.0从官方 docker PPA 安装,因为我的配置文件EnvironmentFile中似乎缺少。dockersystemd

一种选择是就地编辑它并使用此命令添加它:

sudo systemctl edit docker --full

但这可能会被下一次更新覆盖,所以我的解决方案是创建一个覆盖,通过运行

sudo systemctl edit docker

然后我决定仅ExecStart在新的配置覆盖中重新定义命令,而不是在下添加和引用新的配置文件/srv/docker/docker.conf

[Service]
ExecStart=
ExecStart=/usr/bin/docker -d -H fd:// --storage btrfs

上面的代码片段没有错误,由于某些与读取其配置覆盖的方式有关的奇怪原因systemd,需要先用空值定义一个值,然后将其重新分配给新值。

一旦我这样做了,守护进程就会顺利启动,我终于可以使用它了。

相关内容