Docker集装箱在系统启动后关闭

Docker集装箱在系统启动后关闭,docker,Docker,由于某些原因,当使用systemd单位文件时,docker容器会启动,但会立即关闭。我曾尝试查找日志,但看不到发生这种情况的任何迹象。是否有人知道如何解决这个问题/找到显示发生了什么的日志 注意:当使用docker start containername引导后手动启动它们时,它会工作(同样在使用systemctl start nginx时) 在进一步挖掘之后,我发现了这个错误:找不到udev设备:没有这样的设备它可能与此有关 单位服务文件: [Unit] Description=nginx-co

由于某些原因,当使用systemd单位文件时,docker容器会启动,但会立即关闭。我曾尝试查找日志,但看不到发生这种情况的任何迹象。是否有人知道如何解决这个问题/找到显示发生了什么的日志

注意:当使用docker start containername引导后手动启动它们时,它会工作(同样在使用systemctl start nginx时)

在进一步挖掘之后,我发现了这个错误:
找不到udev设备:没有这样的设备
它可能与此有关

单位服务文件:

[Unit]
Description=nginx-container
Requires=docker.service
After=docker.service

[Service]
Restart=always
RestartSec=2
StartLimitInterval=3600
StartLimitBurst=5
TimeoutStartSec=5
ExecStartPre=-/usr/bin/docker kill nginx
ExecStartPre=-/usr/bin/docker rm nginx
ExecStart=/usr/bin/docker run -i -d -t --restart=no --name nginx  -p 80:80 -v /projects/frontend/data/nginx/:/var/www -v /projects/frontend: nginx
ExecStop=/usr/bin/docker stop -t 2 nginx

[Install]
WantedBy=multi-user.target
日志输出:

May 28 11:18:15 frontend dockerd[462]: time="2015-05-28T11:18:15Z" level=info msg="-job start(d757f83d4a13f876140ae008da943e8c5c3a0765c1fe5bc4a4e2599b70c30626) = OK (0)"
May 28 11:18:15 frontend dockerd[462]: time="2015-05-28T11:18:15Z" level=info msg="POST /v1.18/containers/nginx/stop?t=2"
May 28 11:18:15 frontend dockerd[462]: time="2015-05-28T11:18:15Z" level=info msg="+job stop(nginx)"
Docker日志:空(Docker日志nginx)

Systemctl输出:(Systemctl状态nginx,nginx.service)


因为您没有在systemd单位文件中指定
类型
,所以systemd使用默认的
simple
。发件人:

如果设置为simple(如果Type=或BusName=都不是,但是 ExecStart=已指定),预期进程 配置为ExecStart=是服务的主进程

这意味着如果由
ExecStart
启动的进程退出,则systemd 将假定您的服务已退出,并将清理所有内容

因为您正在使用
-d
运行docker客户端,所以它将退出 因此,systemd立即清理服务

通常,在使用systemd启动容器时,您不会使用
-d
标志。这意味着客户端将继续运行,并且 将允许systemd收集应用程序生成的任何输出


也就是说,使用systemd启动Docker容器存在一些基本问题。由于Docker的操作方式,systemd实际上无法监视容器的状态。它所能做的只是跟踪docker客户端的状态,而这不是同一件事(客户端可以退出/崩溃/etc而不影响您的容器)。这不仅仅与systemd有关;任何类型的流程主管(upstart、runit、supervisor等)都会遇到同样的问题。

如果您显示run docker命令,可能会更容易分析问题。抱歉,我忘记添加该命令,将其添加到问题中。感谢您的精彩解释,这并没有解决我的问题,但帮助我了解更多问题。你说systemd在启动Docker容器方面很糟糕。那么,有没有一种更简单/更好的方法让容器在启动时启动?我不确定这为什么不能解决您的问题;在systemd单元中调用
docker run
而不调用
-d
,这是相当常见的,尽管模型中存在固有的问题。对我和其他很多人来说都很好。在进行更改后,您看到了什么样的行为?现在我甚至无法手动启动容器,我添加了以下行:Type=notify NotifyAccess=all,还删除了-d标志。为什么要添加
Type=notify
?我一点也没有建议。我以为你的意思是我还必须设置那个类型字段。我删除了它,但仍然有同样的问题。这是服务文件现在的样子:
● nginx.service - nginx-container
   Loaded: loaded (/etc/systemd/system/multi-user.target.wants/nginx.service)
   Active: failed (Result: start-limit) since Thu 2015-05-28 11:18:20 UTC; 12min ago
  Process: 3378 ExecStop=/usr/bin/docker stop -t 2 nginx (code=exited, status=0/SUCCESS)
  Process: 3281 ExecStart=/usr/bin/docker run -i -d -t --restart=no --name nginx -p 80:80 -v /projects/frontend/data/nginx/:/var/www -v /projects/frontend:/nginx (code=exited, status=0/SUCCESS)
  Process: 3258 ExecStartPre=/usr/bin/docker rm nginx (code=exited, status=0/SUCCESS)
  Process: 3246 ExecStartPre=/usr/bin/docker kill nginx (code=exited, status=0/SUCCESS)
 Main PID: 3281 (code=exited, status=0/SUCCESS)

May 28 11:18:20,frontend systemd[1]: nginx.service holdoff time over, scheduling restart.
May 28 11:18:20 frontend systemd[1]: start request repeated too quickly for nginx.service
May 28 11:18:20 frontend systemd[1]: Failed to start nginx-container.
May 28 11:18:20 frontend systemd[1]: Unit nginx.service entered failed state.
May 28 11:18:20 frontend systemd[1]: nginx.service failed.