我最近一直在将网络服务移植到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
如前所述,该服务运行正常,我可以访问网络服务。
现在,我尝试使用docker-compose.yml进行部署,但服务仍在退出/关闭。我试图检索日志,但我没有成功。我只能通过 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文件中的入口点条目只是为了确保以/ bin / bash作为参数运行start-service.sh脚本,以保持服务运行。但是,服务再次关闭。
答案 0 :(得分:1)
bash
将在没有正确tty的情况下退出。由于您通过bash
执行exec
,因此它变为PID 1.每当PID 1退出时,容器就会停止。
要防止在撰写文件中将tty: true
添加到服务的说明中。这与使用-t
命令的docker run
基本相同。