使用docker run -dit正常运行图像,但是使用docker stack deploy -c

时间:2017-08-31 08:56:42

标签: docker docker-compose docker-swarm

我最近一直在将网络服务移植到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脚本,以保持服务运行。但是,服务再次关闭。

1 个答案:

答案 0 :(得分:1)

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

要防止在撰写文件中将tty: true添加到服务的说明中。这与使用-t命令的docker run基本相同。