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
所做的基本相同。
我最近一直在将 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
所做的基本相同。