图像使用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来部署这个服务,但服务一直在退出/closures。 我试图检索日志,但我没有成功。 所有我可以从docker工人ps -a看到它是运行一秒或2(或3),然后退出。

这是我的docker-compose.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作为参数运行,以保持服务正常运行。 但是,服务又一次closures了。

bash会在没有适当的tty的情况下退出。 由于您通过exec执行bash ,所以变成PID 1.每当PID 1退出容器就停止。

为了防止在撰写文件中添加tty: true到服务的描述。 这和docker run命令中的-t是基本相同的。