Gunicorn优雅地停靠与码头工人组成

时间:2017-04-24 09:43:20

标签: python docker docker-compose gunicorn

我发现当我使用docker-compose关闭我的gunicorn(19.7.1)python应用程序时,它总是需要10秒才能关闭。这是在强制终止进程之前docker-compose等待的默认最长时间(使用-t / --timeout参数调整)。我认为这意味着gunicorn没有被优雅地关闭。我可以用以下内容重现:

搬运工-compose.yml:

version: "3"
services:
  test:
    build: ./
    ports:
      - 8000:8000

Dockerfile:

FROM python

RUN pip install gunicorn

COPY test.py .

EXPOSE 8000
CMD gunicorn -b :8000 test:app

test.py

def app(_, start_response):
    """Simplest possible application object"""
    data = b'Hello, World!\n'
    status = '200 OK'
    response_headers = [
        ('Content-type', 'text/plain'),
        ('Content-Length', str(len(data)))
    ]
    start_response(status, response_headers)
    return iter([data])

然后运行应用程序:

docker-compose up -d

并优雅地停止:

docker-compose stop

版本:

docker-compose version 1.12.0, build b31ff33

我宁愿让gunicorn优雅地停下来。我认为它应该能够基于base.py中的信号处理程序。

以上所有情况也适用于使用docker-compose up -d两次更新图像,第二次使用新图像替换旧图像。

我误解/误用了什么吗? docker-compose发送什么信号来停止进程?不应该使用它吗?我应该能够以超过10秒的速度重启我的应用程序吗?

1 个答案:

答案 0 :(得分:1)

TL; DR

在您的dockerfile中添加exec CMD:CMD exec gunicorn -b :8000 test:app

详细信息

我遇到同样的问题,当我跑docker exec my_running_gunicorn ps aux时,我看到了类似的内容:

gunicorn     1  0.0  0.0   4336   732 ?        Ss   10:38   0:00 /bin/sh -c gunicorn -c gunicorn.conf.py vision:app
gunicorn     5  0.1  1.1  91600 22636 ?        S    10:38   0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app
gunicorn     8  0.2  2.5 186328 52540 ?        S    10:38   0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app

1 PID不是gunicorn master,因此它没有收到sigterm信号。

使用Dockerfile中的exec,我现在有了

gunicorn     1 32.0  1.1  91472 22624 ?        Ss   10:43   0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app
gunicorn     7 45.0  1.9 131664 39116 ?        R    10:43   0:00 /usr/local/bin/python /usr/local/bin/gunicorn -c gunicorn.conf.py vision:app

它有效。