镜像使用docker run-dit正常运行,但使用docker stack deploy-c退出



我最近一直在将一个web服务移植到docker。正如标题中提到的,我遇到了一个奇怪的场景,当我使用docker-run-dit运行它时,服务在后台运行,但当我使用docker-compose.yml时,服务退出。

更清楚地说,我在Dockerfile中有一个入口点:

ENTRYPOINT ["/data/start-service.sh"]

这是start-service.sh:的代码

#!/bin/bash
/usr/local/bin/uwsgi --emperor=/data/vassals/ --daemonize=/var/log/uwsgi/emperor.log
/etc/init.d/nginx start
exec "$@";

正如您所看到的,我只是在这个shell脚本中启动uwsgi和nginx。最后一行(exec(只是让脚本接受一个参数并保持其运行。然后我运行这个使用:

docker run -dit -p 8080:8080 --name=web_server webserver /bin/bash

如前所述,该服务运行正常,我可以访问该Web服务。

现在,我尝试使用docker-compose.yml来部署它,但服务一直在退出/关闭。我试图检索日志,但没有成功。从docker ps-a中,我所能看到的就是它运行一秒钟或2(或3(,然后退出。

这是我的码头组合。yml:

version: "3"
services:
web_server:
image: webserver
entrypoint:
- /data/start-service.sh
- /bin/bash
ports:
- "8089:8080"
deploy:
resources:
limits:
cpus: "0.1"
memory: 2048M
restart_policy:
condition: on-failure
networks:
- webnet
networks:
- webnet

yml文件中的入口点条目只是为了确保start-service.sh脚本将以/bin/bash作为其参数运行,以保持服务运行。但服务再次关闭。

bash将在没有正确tty的情况下退出。由于您通过exec执行bash,因此它变为PID 1。每当PID 1退出时,容器就会停止。

为了防止这种情况,请将tty: true添加到撰写文件中的服务描述中。这与使用docker run命令处理-t基本相同。

最新更新