我有一个服务定义,它使用systemd在CentOS 7上启动docker容器:
Original Answer翻译成"最初的回答"
[Unit]
Description=MappingService
After=portal.service
Requires=docker.service
[Service]
TimeoutStartSec=3000
Type=forking
WorkingDirectory=/home/user/Downloads/MS_0.3.4_artifact
ExecStartPre=-/bin/docker rm -f eb-mapping-service-container
ExecStartPre=/home/user/Downloads/MS_0.3.4_artifact/deploy.sh /home/user/Downloads/MS_0.3.4_artifact/eb-mapping-service.tgz
ExecStartPre=/bin/docker run -v /dev/log:/dev/log -d -ti --log-driver=journald --network=bridge -p 9090:9090 --name eb-mapping-service-container eb-mapping-service /bin/bash -c "cd /build/MappingService; ./start_multiple_clients_mapping_service.sh"
ExecStart=/bin/docker start -a eb-mapping-service-container
ExecStop=/bin/docker stop eb-mapping-service-container
[Install]
WantedBy=multi-user.target
这个服务可以工作。它启动的Docker容器正在运行。 每当我开机时,它都在运行。但是,我的问题是,这个服务从来没有达到Active(Running)状态。相反,它一直停留在“Activating(start)”状态。 “start_multiple_clients_mapping_service.sh”脚本启动一个node.js服务器,并开始监听,因此它不会直接退出。
我在各处搜索,并查看了Docker的文档,但找不到答案。
此外,如果我从docker start命令中删除“-a”,那么状态将是Inactive(dead),即使容器正在运行。
更新:
经过一段时间(我没有确切的数字),服务会因超时而失败。虽然服务已经失败,但docker仍在继续运行,并且可以使用。我已经通过 docker container ls
进行了验证。
问题:
如何更改我的服务定义以反映Docker的Active(Running)状态?
Type=
中指定的那样进行_fork_操作。容器进程不是docker start
进程的子进程,而是Docker守护程序的子进程,它们分别运行(更正式地说,有更长的层次结构,但主要观点是它与docker start
进程无关)。因为您将服务分类为forking
,所以systemd
等待docker start
生成子进程并退出,让子进程继续运行,但实际上docker start
一直在运行(因为使用了-a
选项),所以systemd
认为服务正在启动中。 - undefined