buildkite/docker-signal-test

Name: docker-signal-test

Owner: Buildkite

Description: A test for whether `docker run` handles signals correctly

Created: 2015-04-07 15:52:28.0

Updated: 2017-06-16 21:42:06.0

Pushed: 2015-04-07 17:18:19.0

Homepage:

Size: 132

Language: Shell

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

Docker Signal Tester

Docker does not proxy through signals to running containers in tty mode.

Setup
cker build -t docker-signal-test .
Test 1: docker run (no -t) with kill

Shell 1:

cker run --rm=true docker-signal-test ./signal_printer.sh
ing for a signal...

Shell 2:

cker ps
AINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS               NAMES
d1f6535d        docker-signal-test:latest   "./signal_printer.sh   31 seconds ago      Up 30 seconds                           romantic_pasteur    
 | grep 'docker run'
0 ttys003    0:00.17 docker run --rm=true docker-signal-test ./signal_printer.sh
ll -s TERM 45470

Shell 1 outputs…

ing for a signal...
ived SIGTERM
ing...

:thumbsup:

Test 2: docker run -t with docker kill

Shell 1:

cker run -t --rm=true docker-signal-test ./signal_printer.sh
ing for a signal...

Shell 2:

cker ps
AINER ID        IMAGE                       COMMAND                CREATED             STATUS              PORTS               NAMES
c658052b        docker-signal-test:latest   "./signal_printer.sh   41 seconds ago      Up 40 seconds                           romantic_shockley   
cker kill -s SIGTERM e8f5c658052b

Shell 1 outputs…

ing for a signal...
ived SIGTERM
ing...

:thumbsup:

Test 3: docker run -t with kill

Shell 1:

cker run -t --rm=true docker-signal-test ./signal_printer.sh
ing for a signal...

Shell 2:

cker ps
AINER ID        IMAGE                       COMMAND                CREATED              STATUS              PORTS               NAMES
b9eeeb36        docker-signal-test:latest   "./signal_printer.sh   About a minute ago   Up About a minute                       sick_banach         
 | grep 'docker run'
0 ttys003    0:00.17 docker run -t --rm=true docker-signal-test ./signal_printer.sh
ll -s TERM 44420

Shell 1 outputs…

ing for a signal...

Shell 2 shows Docker is still running:

cker ps
AINER ID        IMAGE                       COMMAND                CREATED              STATUS              PORTS               NAMES
b9eeeb36        docker-signal-test:latest   "./signal_printer.sh   About a minute ago   Up About a minute                       sick_banach         

:thumbsdown:

This is no surprise really, because docker run --help says this:

sig-proxy=true           Proxy received signals to the process (non-TTY mode only). SIGCHLD, SIGSTOP, and SIGKILL are not proxied.
Test 4: docker-compose run with kill

Shell 1:

cker-compose run --rm test ./signal_printer.sh
ing for a signal...

Shell 2:

 | grep 'docker-compose'
3 ttys002    0:00.05 docker-compose run --rm test ./signal_printer.sh
4 ttys002    0:00.21 docker-compose run --rm test ./signal_printer.sh
ll -s TERM 58623
output)

Shell 1:

ing for a signal...
inated: 15
cker ps
AINER ID        IMAGE                          COMMAND                CREATED              STATUS              PORTS               NAMES
8fd3fdb7        dockersignaltest_test:latest   "./signal_printer.sh   About a minute ago   Up About a minute                       dockersignaltest_test_run_11   
cker logs 8e8c8fd3fdb7
ing for a signal...
ing for a signal...
cker kill -s TERM 8e8c8fd3fdb7
8fd3fdb7
cker logs 8e8c8fd3fdb7
ing for a signal...
ing for a signal...
ived SIGTERM
ing...

:thumbsdown:

Test 5: docker-compose run -T with kill

Shell 1:

cker-compose run -T --rm test ./signal_printer.sh
output)

Shell 2:

cker ps
AINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS               NAMES
7bad0c61        dockersignaltest_test:latest   "./signal_printer.sh   4 minutes ago       Up 4 seconds                            dockersignaltest_test_run_8   
cker logs 37397bad0c61
ing for a signal...
ing for a signal...
 | grep docker
3 ttys002    0:00.06 docker-compose run -T test ./signal_printer.sh
4 ttys002    0:00.24 docker-compose run -T test ./signal_printer.sh
ll -s TERM 55273

Shell 1:

cker-compose run -T test ./signal_printer.sh
inated: 15

Shell 2:

cker ps
AINER ID        IMAGE                          COMMAND                CREATED             STATUS              PORTS               NAMES
7bad0c61        dockersignaltest_test:latest   "./signal_printer.sh   7 minutes ago       Up 3 minutes                            dockersignaltest_test_run_8
cker logs 37397bad0c61
ing for a signal...
ing for a signal...
 | grep docker
output)
cker kill -s SIGTERM 37397bad0c61
7bad0c61
cker logs 37397bad0c61
ing for a signal...
ing for a signal...
ived SIGTERM
ing...

:thumbsdown:

In Summary

With docker run you can only send signals to the docker process (and have them passed to the inner process) if the container is running in non-tty mode (-T with docker-compose run, or without the -t for docker run). If you run in tty mode you need to send signals using docker kill -s SIGNAME.

With docker-compose you can't send any process signals to it directly, as it doesn't proxy them (whether started -T or not). Also when it does receive a TERM signal it echoes Terminated and terminates, but it fails to shut down the running Docker container. The only way to kill the running container is to run docker kill.


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.