从docker-compose运行时容器以代码0退出

时间:2020-05-09 08:19:07

标签: python django bash docker docker-compose

我正在尝试从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)) ??

1 个答案:

答案 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 "$@"

(我会避免在容器启动脚本中运行后台进程:没有任何东西可以监视或重新启动这些进程,因此您可以在容器运行了一半的情况下结束,或者不必要地重新启动某些事情,因为其他的则有更新。如果需要运行多个进程,请尝试将它们安排在单独的容器中运行;如果只需要一个,则将其作为前台进程运行。)