使用systemd运行Docker容器

3

我有一个服务定义,它使用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)状态?


1
问题在于您的服务实际上并没有像您在Type=中指定的那样进行_fork_操作。容器进程不是docker start进程的子进程,而是Docker守护程序的子进程,它们分别运行(更正式地说,有更长的层次结构,但主要观点是它与docker start进程无关)。因为您将服务分类为forking,所以systemd等待docker start生成子进程并退出,让子进程继续运行,但实际上docker start一直在运行(因为使用了-a选项),所以systemd认为服务正在启动中。 - undefined
1个回答

6

我明白了问题所在。有几个地方出了问题:

  1. docker run命令不应该使用-d和-ti标志。
  2. Type应该设置为exec而不是forking。

做完这两个更改后,我成功启动了Docker,并获得了一直追求的Active(Running)状态。


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