Docker 鏡像調(diào)試的最佳實(shí)踐
當(dāng)你已經(jīng)構(gòu)建了一個(gè) Docker 鏡像,但運(yùn)行它的容器啟動(dòng)后立即退出(通常是因?yàn)榉?wù)異常或配置錯(cuò)誤),你仍然可以通過以下幾種方式進(jìn)入鏡像內(nèi)部進(jìn)行調(diào)試。
? 最佳實(shí)踐:如何對(duì)一個(gè)“啟動(dòng)即退出”的鏡像進(jìn)行命令行調(diào)試?
?? 目標(biāo)
進(jìn)入容器的命令行環(huán)境,即使它默認(rèn)運(yùn)行的服務(wù)會(huì)失敗。
? 方法一:使用 docker run 覆蓋 CMD,直接進(jìn)入 shell
這是最推薦的方式。
?? 命令:
docker run -it --rm openeuler/dns:22.03-lts-sp4 /bin/sh
?? 說明:
-it:?jiǎn)⒂媒换ナ浇K端。--rm:退出后自動(dòng)刪除容器(臨時(shí)調(diào)試用)。/bin/sh:覆蓋鏡像的默認(rèn)CMD,不運(yùn)行服務(wù),而是進(jìn)入 shell。- 如果你的鏡像中沒有
bash,[sh](file://e:\docker_workspaces(svn.home)\base_systems\openEuler_dns\CreateContainer.sh) 通常是存在的。
?? 示例輸出:
/ # ls /etc/named.conf /etc/named.conf
你可以在這個(gè) Shell 中檢查配置文件、權(quán)限、用戶是否存在等問題。
? 方法二:使用 docker run + --entrypoint 進(jìn)入(適用于自定義 ENTRYPOINT 的情況)
如果你的鏡像設(shè)置了 ENTRYPOINT(比如總是運(yùn)行某個(gè)腳本),你可以通過 --entrypoint 覆蓋它。
?? 命令:
docker run -it --rm --entrypoint /bin/sh openeuler/dns:22.03-lts-sp4
?? 說明:
--entrypoint會(huì)忽略 Dockerfile 中定義的ENTRYPOINT和CMD- 然后你再手動(dòng)執(zhí)行你想測(cè)試的命令,例如:
/usr/sbin/named -g -c /etc/named.conf
? 方法三:創(chuàng)建一個(gè)新的調(diào)試鏡像(適合復(fù)雜場(chǎng)景)
如果你經(jīng)常需要調(diào)試這個(gè)鏡像,可以新建一個(gè)用于調(diào)試的鏡像,修改其行為。
1. 創(chuàng)建 [debug.Dockerfile](file://e:\docker_workspaces(svn.home)\base_systems\openEuler_dns\debug.Dockerfile) 文件:
FROM openeuler/dns:22.03-lts-sp4 # 覆蓋原 CMD,改為進(jìn)入 Shell CMD ["/bin/sh"]
2. 構(gòu)建調(diào)試鏡像:
docker build -f debug.Dockerfile -t openeuler/dns:debug .
3. 啟動(dòng)并調(diào)試:
docker run -it --rm openeuler/dns:debug
這樣你就可以在一個(gè)和原鏡像幾乎一致的環(huán)境中進(jìn)行排查了。
? 方法四:查看日志 + inspect 日志文件 + 掛載目錄分析
如果你只是想快速查看出錯(cuò)原因,可以結(jié)合以下命令定位問題:
?? 查看容器日志:
docker logs <container_name_or_id>
?? 進(jìn)入容器文件系統(tǒng)(即使沒運(yùn)行):
docker create --name debug-container openeuler/dns:22.03-lts-sp4 docker cp debug-container:/var/log/messages ./messages.log cat ./messages.log
或者掛載目錄后查看文件:
docker run -it --rm -v ./debug:/mnt openeuler/dns:22.03-lts-sp4 /bin/sh ls /mnt
? 方法五:使用 scratch 容器復(fù)制文件出來分析
有時(shí)你只需要看看里面的文件內(nèi)容而不運(yùn)行服務(wù)本身。
docker create --name temp openeuler/dns:22.03-lts-sp4 docker cp temp:/etc/named.conf ./named.conf docker rm temp
然后在宿主機(jī)上編輯、檢查配置。
? 方法六:使用 nsenter 進(jìn)入容器命名空間(高級(jí))
如果你有運(yùn)行過的容器(哪怕只運(yùn)行了幾秒),可以用 nsenter 進(jìn)入其命名空間。
1. 查看容器 PID:
docker inspect <container_id> | grep HostPid
2. 使用 nsenter 進(jìn)入:
sudo nsenter -t <PID> -m -u -i -n -p
這可以讓你看到容器內(nèi)完整的進(jìn)程、網(wǎng)絡(luò)、掛載信息。
? 總結(jié):不同場(chǎng)景下的調(diào)試策略
| 場(chǎng)景 | 推薦方法 |
|---|---|
| 容器啟動(dòng)后立刻退出 | 使用 docker run ... /bin/sh 替換 CMD |
| 使用了 ENTRYPOINT | 使用 --entrypoint /bin/sh |
| 需要保留容器狀態(tài) | 使用 docker create + docker cp |
| 想復(fù)用原有邏輯調(diào)試 | 創(chuàng)建 debug.Dockerfile 并重新構(gòu)建 |
| 分析配置文件 | 使用 docker cp 或 mount volume |
| 高級(jí)調(diào)試(pid/ns) | 使用 nsenter 或 docker inspect |
? 附注:如何查看容器退出原因?
docker inspect <container_id> | grep -i "exit_code" # 或者 docker inspect <container_id> | grep -A 10 "State"
輸出示例:
"State": {
"ExitCode": 1,
"Error": "",
"FinishedAt": "2025-05-20T12:00:00Z",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 1,
"Error": "",
"StartedAt": "2025-05-20T11:59:59Z",
"FinishedAt": "2025-05-20T11:59:59Z"
}
如果 ExitCode != 0,表示非正常退出,結(jié)合日志進(jìn)一步查錯(cuò)。
? 最終建議流程
# 1. 進(jìn)入容器 shell docker run -it --rm openeuler/dns:22.03-lts-sp4 /bin/sh # 2. 手動(dòng)運(yùn)行 DNS 服務(wù)以調(diào)試 /usr/sbin/named -g -c /etc/named.conf # 3. 檢查文件權(quán)限 ls -l /var/named # 4. 查看日志文件 cat /var/log/messages # 5. 檢查 named 用戶是否存在 id named
如果你愿意貼出完整的 [Dockerfile](file://e:\docker_workspaces(svn.home發(fā)生異常,可以輸入更多信息再讓我來回答或重試
到此這篇關(guān)于Docker 鏡像調(diào)試的最佳實(shí)踐的文章就介紹到這了,更多相關(guān)Docker 鏡像調(diào)試內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用Docker定時(shí)備份數(shù)據(jù)
這篇文章主要介紹了如何使用Docker定時(shí)備份數(shù)據(jù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-04-04
docker鏡像下載的另一種方式(實(shí)測(cè)有效!)
在Docker中下載鏡像是一個(gè)關(guān)鍵步驟,因?yàn)殓R像是容器運(yùn)行的基礎(chǔ)這篇,文章主要給大家介紹了關(guān)于docker鏡像下載的另一種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
解決Docker安裝錯(cuò)誤failure:repodata/repomd.xml from docke
在使用yum命令安裝docker或其他工具時(shí)可能會(huì)遇到failure_repodata_repomd.xmlfromdocker-ce-stable_[Errno256]Nomoremirrorstotry的錯(cuò)誤,原因可能是yum源配置問題,解決方法包括重置yum源,刪除多余的repo文件2024-11-11
docker容器通信參數(shù)使用及l(fā)ink參數(shù)介紹
這篇文章主要介紹了docker容器通信參數(shù)使用及l(fā)ink參數(shù)介紹,link的原理就是在/etc/hosts里面添加了一個(gè)alias的名稱,本文通過案例分析給大家詳細(xì)講解,需要的朋友可以參考下2022-09-09
Docker使用nodejs鏡像構(gòu)建express服務(wù)的方法
這篇文章主要介紹了Docker使用nodejs鏡像構(gòu)建express服務(wù),主要包括nodejs容器的啟動(dòng),安裝nodejs第三方依賴模塊及啟動(dòng)nodejs服務(wù)的相關(guān)操作,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
解決執(zhí)行docker daemon命令時(shí)出錯(cuò)的問題
daemon 這是docker 操作中十分常用的命令指定項(xiàng),最近在運(yùn)行docker daemon命令卻發(fā)生了錯(cuò)誤,后來通過測(cè)試各種方法終于解決了,現(xiàn)在將方法分享給大家,有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-11-11

