由于某些原因,当使用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.
答案 0 :(得分: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 client 的状态,这不是一回事(客户端可以在不影响容器的情况下退出/崩溃等)。这不仅与systemd有关; 任何类型的流程主管(upstart,runit,supervisor等)都会遇到同样的问题。