在Docker 1.10.3的CentOS 7.2机器上,我成功测试了以下内容(以root用户身份运行):
docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ -d eboraas/apache
可以从容器中运行的apache服务自动部署到“/ opt / app / uslJavadoc”的内容。
因此,我的下一步是使它与systemd一起使用,因此我创建了“/etc/systemd/system/docker-usljavadoc.service”,其内容如下:
[Unit]
Description=Apache serving USL Javadoc
Requires=docker.service
After=docker.service
[Service]
TimeoutStartSec=0
Restart=always
ExecStart=/usr/bin/docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ -d eboraas/apache
ExecStop=/usr/bin/docker stop -t 2 usljavadoc_server
ExecStopPost=/usr/bin/docker rm -f usljavadoc_server
[Install]
WantedBy=default.target
我手动重新加载了systemd并启动了服务。我验证了另一个盒子上的浏览器可以到达apache进程并获取正确提供的内容。然后,我重新启动以确保它可以在重新启动时工作。仍然有效。
所以,我以为我完成了。但是,当我仔细观察时发现,该服务已成功启动,但启动后立即退出,然后重新启动。这是不断发生的。由于仅提供纯HTML内容(一个Javadoc树),并且该服务立即重新启动,因此用户甚至可能没有注意到存在问题,但是绝对不应该这样做。
有什么想法可以解释为什么该“docker run”可以在shell上正常运行,并且似乎可以从systemd正常启动,但是在几秒钟后立即退出?
最佳答案
从运行命令中删除-d
选项。
ExecStart=/usr/bin/docker run --name usljavadoc_server -p 80:80 -p 443:443 -v /opt/app/uslJavadoc/:/var/www/html/ eboraas/apache
在docker docs中描述:
在
ExecStart
之后,您的客户端退出。 Systemd会将此视为错误并执行您的ExecStop命令+尝试重新启动(restart=always
)