2014-01-28 3 views
6

У меня есть длительный процесс в контейнере докера, к которому я хотел бы приложить gdb, чтобы посмотреть, какие потоки запущены и получить stacktraces. Я могу подключиться к процессу с хоста, но я не могу разрешить какие-либо символы, потому что исполняемый файл находится в другом месте в файловой системе (он установлен на уровне док-станции), а общие системные библиотеки все застревают в изображении файловой системы докеров где-то в/var/lib/docker.Как я могу подключить gdb к процессу, запущенному в контейнере докера?

Я могу сгенерировать основной файл и использовать gdb, чтобы посмотреть на него, указав путь хоста к исполняемому файлу, но поскольку системные библиотеки находятся в неправильных местах и ​​загружены в неправильные местоположения в файле corefile , Я не получаю от этого никакой информации.

Есть ли у меня какие-либо опции, которые я забыл?

+0

Вы можете быть в состоянии установить GDB в образ, а затем использовать '' Докер запустить --volumes-from'' установить файлы из другого контейнера, если вы поделились, что Докер установленный объем. – Andy

ответ

11

Вы можете прикрепить к процессу с помощью экземпляра gdb в контейнере, подключив его к работающему контейнеру через lxc-attach.

Примечание: gdb должен быть установлен в этом контейнере, или вы должны установить его.

# find your container ID 
sudo docker ps 
# list of your containers - container ID is 1234567890 
# find your full container ID 
sudo docker ps --no-trunc -q| grep <short ID> 
sudo lxc-attach -n <container long ID> 

[email protected]:/# 
# optionally, you can install gdb now if it is not installed 
# yum install gdb 

[email protected]:/# gdb 
... 
(gdb) attach 1 

UPDATE 2017-04:

Существует простой рабочий процесс с помощью докер Exec теперь доступны (спасибо @ 42n4).

# find your container ID 
sudo docker ps 
# list of your containers - container ID is 1234567890 
docker exec -i -t 1234567890 /bin/bash 

[email protected]:/# 
# optionally, you can install gdb now if it is not installed 
# yum install gdb 

[email protected]:/# gdb 
... 
(gdb) attach 1 
+1

Последний докер использует «Id» вместо «ID». sudo docker инспектировать 1234567890 | grep '"Id"' | sed 's/[^ 0-9a-z] // g' –

+1

Это дает все длинные идентификаторы: docker ps --no-trunc | awk '{print $ 1}'; но lxc-attach не работает сейчас, может быть, docker exec -it 'short id'/bin/bash? – 42n4

+0

@ 42n4 docker ps --no-trunc -q | grep также возможен – Jiri

Смежные вопросы