我正在尝试从docker文件运行容器。
**docker-compose.yml**
services:
djangoapp:
build: .
volumes:
- .:/opt/services/djangoapp/src
ports:
- 8000:8000
**Dockerfile** this is entry in Docker file
ENTRYPOINT bash start.sh
**start.sh**
#!/bin/bash
## run gunicorn in background......
gunicorn --chdir hello --bind :8000 hello_django.wsgi:application &
当我从相同的 Dockerfile 构建映像时,它的工作正常。 当我从docker-compose启动时,它显示已退出,代码为0 。 我想知道我的码头工人退出的原因(18秒前已退出(0)) ??
答案 0 :(得分:0)
您的start.sh
脚本启动一些后台进程,然后到达末尾并退出(成功,所以状态码为0)。当start.sh
脚本退出时,由于其是容器的ENTRYPOINT
,因此该容器以相同的状态码退出。
需要有一些进程作为前台进程运行,并且只要该进程处于运行状态,容器就将保持运行状态。在您的情况下,这就是GUnicorn流程,您可以在Dockerfile中将其指定为映像的CMD
:
CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application
如果start.sh
脚本中唯一的一行正在运行,则可以删除ENTRYPOINT
行。如果不是,请将其更改为在最后一行运行exec "$@"
(以运行CMD
),然后将Dockerfile ENTRYPOINT
行更改为JSON数组语法:
RUN chmod +x start.sh
ENTRYPOINT ["./start.sh"]
CMD gunicorn --chdir hello --bind :8000 hello_django.wsgi:application
#!/bin/sh
# ... do other pre-launch setup ...
# Run the CMD
exec "$@"
(我会避免在容器启动脚本中运行后台进程:没有任何东西可以监视或重新启动这些进程,因此您可以在容器运行了一半的情况下结束,或者不必要地重新启动某些事情,因为其他的则有更新。如果需要运行多个进程,请尝试将它们安排在单独的容器中运行;如果只需要一个,则将其作为前台进程运行。)