Docker容器在systemd启动后关闭

7
由于某些原因,使用systemd单元文件时,我的docker容器会启动,但立即关闭。我尝试查找日志,但无法看到任何指示说明发生了什么。是否有人知道如何解决此问题/查找显示正在发生的内容的日志?
注意:在引导后手动启动它们时,使用docker start containername可以正常工作(也可以使用systemctl start nginx)。
经过进一步挖掘,我发现了这个错误:could not find udev device: No such device,这可能与此有关?
单元服务文件:
[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

Journalctl 输出:

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 logs nginx)

Systemctl输出: (systemctl status nginx, nginx.service)

● 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.

也许如果您展示一下运行Docker命令,那么分析问题会更容易些。 - miguelbgouveia
抱歉,我忘记添加那个了,已经加到问题中了。 - Xavier Geerinck
1个回答

10
因为你在systemd单元文件中未指定Type,所以systemd正在使用默认值simple。从systemd.service得知:

如果设置为simple(如果未同时指定Type =和BusName=,但指定了ExecStart =,则为默认值),则应配置具有ExecStart =的进程为服务的主进程。

这意味着,如果ExecStart启动的进程退出,systemd将假定您的服务已退出,并清理所有内容。
因为你使用-d运行docker客户端,它会立即退出......因此,systemd会清理服务。
通常,在使用systemd启动容器时,您不会使用-d标志。这意味着客户机将继续运行,并允许systemd收集应用程序生成的任何输出。
也就是说,使用systemd启动Docker容器存在根本性问题。由于Docker的操作方式,systemd实际上无法监视容器的状态。它只能跟踪docker客户端的状态,而这并不是相同的东西(客户端可能会退出/崩溃等,而不影响您的容器)。这不仅适用于systemd;任何类型的进程监管程序(upstart,runit,supervisor等)都会遇到相同的问题。

非常感谢您的详细解释,虽然这并没有解决我的问题,但是帮助我更好地理解了它。您说systemd在启动Docker容器方面存在问题。那么有没有更简单/更好的方法来在启动时启动容器呢? - Xavier Geerinck
我不确定为什么这没有解决你的问题;在systemd单元中调用docker run而不带上-d是相当常见的,尽管这种模式存在固有的问题。对我和许多其他人来说都很好用。在进行了这种更改后,您看到了什么样的行为? - larsks
你为什么加了 Type=notify?我根本没有建议这样做。 - larsks
好的,你是对的,我已经让它工作了。我只需要改变一些停止参数就行了。谢谢你!!你救了我的一天! - Xavier Geerinck
rkt已经解决了这个问题,它与systemd有本地集成。 - dashesy
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接