Container Optimized OS Graceful Shutdown of Celery

1/11/2018

Running COS on GCE

Any ideas on how to get COS to do a graceful docker shutdown?

My innermost process is celery, which says he wants a SIGTERM to stop gracefully

http://docs.celeryproject.org/en/latest/userguide/workers.html#stopping-the-worker

My entrypoint is something like

exec celery -A some_app worker -c some_concurrency

On COS I am running my docker a service, something like

write_files:
- path: /etc/systemd/system/servicename.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Some service

    [Service]
    Environment="HOME=/home/some_home"
    RestartSec=10
    Restart=always
    ExecStartPre=/usr/share/google/dockercfg_update.sh
    ExecStart=/usr/bin/docker run -u 2000 --name=somename --restart always some_image param_1 param_2
    ExecStopPost=/usr/bin/docker stop servicename
    KillMode=processes
    KillSignal=SIGTERM

But ultimately when my COS instance it shut down, it just yanks the plug.

Do I need to add a shutdown script to do a docker stop? Do I need to do something more advanced?

-- bwawok
celery
docker
google-container-os
google-kubernetes-engine

1 Answer

1/11/2018

What is the expected exit status of your container process when when it receives SIGTERM? Running systemctl stop <service> then systemctl status -l <service> should show the exit code of the main process. Example:

Main PID: 21799 (code=exited, status=143)

One possibility is that the process does receive SIGTERM and shuts down gracefully, but returns non-zero exit code. This would make the systemd believe that it didn't shutdown correctly. If that is the case, adding

SuccessExitStatus=143

to your systemd service should help. (Replace 143 with the actual exit code of your main process.)

-- Aditya K.
Source: StackOverflow