Docker容器在使用Fleet启动时退出

我使用Fleet通过以下系统文件在CoreOS上启动Docker容器:

[Unit] Description=Developer News API After=docker.service Requires=docker.service [Service] ExecStartPre=-/usr/bin/docker kill devnews-core ExecStartPre=-/usr/bin/docker rm devnews-core ExecStartPre=/usr/bin/docker pull imjacobclark/devnews-core ExecStart=/usr/bin/docker run -d -p 1337:1337 --name devnews-core imjacobclark/devnews-core ExecStop=/usr/bin/docker stop devnews-core TimeoutStartSec=0 Restart=always RestartSec=10s 

我在这里执行的主要的Docker命令是docker run -d -p 1337:1337 --name devnews-core imjacobclark/devnews-core当独立运行的时候正常工作,并且在端口1337暴露了Web服务的期望结果。

然而,当我执行fleetctl devnews-core.service ,Fleet声明启动已完成,但是不断重复启动,这是因为在容器中npm install后,Docker会退出。

通过船队启动服务:

 core@coreos01 ~/devnews-coreos/fleet $ fleetctl start devnews-core.service Unit devnews-core.service launched on 8fdc9312.../ 

日志:

 core@coreos01 ~/devnews-coreos/fleet $ fleetctl --tunnel journal devnews-core.service -- Logs begin at Wed 2015-02-25 13:41:25 UTC, end at Wed 2015-02-25 23:08:55 UTC. -- Feb 25 23:08:47 coreos03 docker[6404]: 44d8123e3829: Download complete Feb 25 23:08:47 coreos03 docker[6404]: 1e278393641a: Download complete Feb 25 23:08:47 coreos03 docker[6404]: ec0fa4f2b126: Download complete Feb 25 23:08:47 coreos03 docker[6404]: 0d98c76d34ce: Download complete Feb 25 23:08:47 coreos03 docker[6404]: eb0a99f0e308: Download complete Feb 25 23:08:47 coreos03 docker[6404]: eb0a99f0e308: Download complete Feb 25 23:08:47 coreos03 docker[6404]: Status: Image is up to date for imjacobclark/devnews-core:latest Feb 25 23:08:47 coreos03 systemd[1]: Started Developer News API. Feb 25 23:08:47 coreos03 docker[6414]: 1d90cf825518610cbd15a44873c1e2640d40522632ed5417ac91f22b82c20ac4 Feb 25 23:08:47 coreos03 docker[6456]: devnews-core 

说明Docker的节点失败:

 core@coreos03 ~ $ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a5970b9f6819 imjacobclark/devnews-core:latest "npm start" 6 seconds ago Exited (143) 5 seconds ago devnews-core 

这个容器只是由公共DockerHubregistry中的标准Docker Node.js容器构build而成,并且在将我的应用程序构build到容器中之后提交。

我是否错过了我的服务文件中的任何重要内容,导致Fleet无法正确启动容器?

答案很简单,不要在恶魔化模式下启动Docker,正确的系统文件应该如下:

 [Unit] Description=Developer News API After=docker.service Requires=docker.service [Service] ExecStartPre=-/usr/bin/docker kill devnews-core ExecStartPre=-/usr/bin/docker rm devnews-core ExecStartPre=/usr/bin/docker pull imjacobclark/devnews-core ExecStart=/usr/bin/docker run -p 1337:1337 --name devnews-core imjacobclark/devnews-core ExecStop=/usr/bin/docker stop devnews-core TimeoutStartSec=0 Restart=always RestartSec=10s 

本质上,Docker运行命令应如下所示:

docker run -p 1337:1337 --name devnews-core imjacobclark/devnews-core