mirror of https://github.com/docker/compose.git
Attach logger to containers after crashing.
Fixes #6060 Signed-off-by: Nicholas Higgins <nickhiggins42@gmail.com>
This commit is contained in:
parent
40631f9a01
commit
28085ebee2
|
@ -210,10 +210,15 @@ def start_producer_thread(thread_args):
|
||||||
|
|
||||||
|
|
||||||
def watch_events(thread_map, event_stream, presenters, thread_args):
|
def watch_events(thread_map, event_stream, presenters, thread_args):
|
||||||
|
crashed_containers = set()
|
||||||
for event in event_stream:
|
for event in event_stream:
|
||||||
if event['action'] == 'stop':
|
if event['action'] == 'stop':
|
||||||
thread_map.pop(event['id'], None)
|
thread_map.pop(event['id'], None)
|
||||||
|
|
||||||
|
if event['action'] == 'die':
|
||||||
|
thread_map.pop(event['id'], None)
|
||||||
|
crashed_containers.add(event['id'])
|
||||||
|
|
||||||
if event['action'] != 'start':
|
if event['action'] != 'start':
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
@ -223,6 +228,11 @@ def watch_events(thread_map, event_stream, presenters, thread_args):
|
||||||
# Container was stopped and started, we need a new thread
|
# Container was stopped and started, we need a new thread
|
||||||
thread_map.pop(event['id'], None)
|
thread_map.pop(event['id'], None)
|
||||||
|
|
||||||
|
# Container crashed so we should reattach to it
|
||||||
|
if event['id'] in crashed_containers:
|
||||||
|
event['container'].attach_log_stream()
|
||||||
|
crashed_containers.remove(event['id'])
|
||||||
|
|
||||||
thread_map[event['id']] = build_thread(
|
thread_map[event['id']] = build_thread(
|
||||||
event['container'],
|
event['container'],
|
||||||
next(presenters),
|
next(presenters),
|
||||||
|
|
|
@ -2253,6 +2253,22 @@ class CLITestCase(DockerClientTestCase):
|
||||||
assert 'logs-composefile_another_1 exited with code 0' in result.stdout
|
assert 'logs-composefile_another_1 exited with code 0' in result.stdout
|
||||||
assert 'logs-composefile_simple_1 exited with code 137' in result.stdout
|
assert 'logs-composefile_simple_1 exited with code 137' in result.stdout
|
||||||
|
|
||||||
|
def test_logs_follow_logs_from_restarted_containers(self):
|
||||||
|
self.base_dir = 'tests/fixtures/logs-restart-composefile'
|
||||||
|
proc = start_process(self.base_dir, ['up'])
|
||||||
|
|
||||||
|
wait_on_condition(ContainerStateCondition(
|
||||||
|
self.project.client,
|
||||||
|
'logs-restart-composefile_another_1',
|
||||||
|
'exited'))
|
||||||
|
|
||||||
|
self.dispatch(['kill', 'simple'])
|
||||||
|
|
||||||
|
result = wait_on_process(proc)
|
||||||
|
|
||||||
|
assert result.stdout.count('logs-restart-composefile_another_1 exited with code 1') == 3
|
||||||
|
assert result.stdout.count('world') == 3
|
||||||
|
|
||||||
def test_logs_default(self):
|
def test_logs_default(self):
|
||||||
self.base_dir = 'tests/fixtures/logs-composefile'
|
self.base_dir = 'tests/fixtures/logs-composefile'
|
||||||
self.dispatch(['up', '-d'])
|
self.dispatch(['up', '-d'])
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
simple:
|
||||||
|
image: busybox:latest
|
||||||
|
command: sh -c "echo hello && tail -f /dev/null"
|
||||||
|
another:
|
||||||
|
image: busybox:latest
|
||||||
|
command: sh -c "sleep 0.5 && echo world && /bin/false"
|
||||||
|
restart: "on-failure:2"
|
Loading…
Reference in New Issue