2014-01-28 77 views
6

我在docker容器中有一個長期運行的進程,我想附加gdb來查看哪些線程正在運行並獲取堆棧跟蹤。我可以附加到主機的進程,但我無法解析任何符號,因爲可執行文件位於文件系統中的不同位置(它位於docker-mounted卷中),共享系統庫全部卡在docker文件系統映像中/ var/lib/docker中的某處。我怎樣才能gdb連接到在碼頭集裝箱運行的進程?

我能夠生成一個核心文件,並使用gdb通過指定主機的可執行文件的路徑來查看它,但是因爲系統庫全部位於錯誤的位置並且被加載到核心文件中的錯誤位置,我從中得不到任何信息。

我有任何我忽略的選項嗎?

+0

您可能可以將gdb安裝到映像中,然後使用docker run -volumes-from''從共享該docker-mounted卷的另一個容器中掛載文件。 – Andy

回答

11

您可以通過lxc-attach通過附加到正在運行的容器來附加到在容器中運行的gdb實例。

注意: 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碼頭檢查1234567890 | grep'「Id」'| sed's/[^ 0-9a-z] // g' –

+1

這給出了所有長ID:docker ps --no-trunc | awk'{print $ 1}';但lxc-attach現在不起作用,也許碼頭執行程序 - 'short id'/ bin/bash? – 42n4

+0

@ 42n4 docker ps --no-trunc -q | grep 也是可能的 – Jiri