image 运行s 正确使用 docker 运行 -dit,但使用 docker stack deploy -c 退出

image runs properly using docker run -dit, but exits using docker stack deploy -c

我最近一直在将 Web 服务移植到 docker。正如标题中提到的,我遇到了一个奇怪的场景,当我 运行 它使用 docker 运行 -dit 时,服务 运行s 在后台,但是当我使用 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) 只是让脚本接受一个参数并将其保持 运行ning。然后我 运行 这个使用:

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

如上所述,服务 运行 正常,我可以访问网络服务。

现在,我尝试使用 docker-compose.yml 来部署它,但是 exiting/shutting 上的服务 keeps 关闭了。我试图检索日志,但没有成功。我从 docker ps -a 中看到的是它 运行s 一秒钟或 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 作为其参数,以保持服务 运行宁。但是,服务再次关闭。

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

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