網站首頁 編程語言 正文
容器啟動直接退出,想進入容器調試改怎么辦
使用過docker的朋友大概率會遇到docker啟動容器失敗或執行完直接退出的情況,如果我想進入容器手動執行命令調試,該怎么辦吶?
docker容器啟動失敗正常都是由于啟動主進程退出導致的,主進程啟動命令往往都是由鏡像Dockerfile文件最后的ENTRYPOINT或CMD定義的,此時可覆蓋主進程啟動命令,更換一個掛起的命令即可。我常用掛起命令:/bin/bash
所以,我們要解決的核心問題就是:如何使用掛起命令覆蓋ENTRYPOINT或CMD定義的容器主進程命令?
先上結論(適用所有鏡像)
1. docker run -it --entrypoint /bin/bash鏡像,執行后直接進入容器。
2. 若docker-compose啟動容器,則需要修改docker-compose.yml文件,在對應服務下增加如下高亮顯示信息;然后docker-compose重新up
version: '3'
services:
cmd:
image: 鏡像
container_name: 容器名
entrypoint:
- tail
- -f
- /dev/null
執行命令進入容器 docker exec -it 容器名 /bin/bash
以下為詳細分析過程:
查看鏡像的dockerfile文件(docker history --no-trunc image),檢查最后容器啟動主進程的命令是什么樣的,ENTRYPOINT?CMD?還是它們的組合?覆蓋方式稍有不同。為方便演示,我構造了一個簡單Dockerfile文件做案例。
Docker RUN 覆蓋容器主進程命令
docker run 使用-it交互參數,覆蓋命令/bin/bash
CMD
FROM centos:latest
MAINTAINER quanling
CMD ["echo","hello World"]
如果使用上面的文件創建鏡像test:cmd,使用history命令查看容器主進程命令,下方橙色標記部分
[root@localhost docker]# docker history --no-trunc test:cmd
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:694d5f2d8809ef2847a9b6fd46efed49ab59aa6466784a1e783beb25c2f6c16e 31 seconds ago /bin/sh -c #(nop) CMD ["echo" "hello World"] 0B
sha256:6dcafb4f0c8d93e8793f84bb837ef26ed6293c156dafafbbc520e55ed601a09e 16 minutes ago /bin/sh -c #(nop) MAINTAINER quanling 0B
sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20210915 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0326ca33fd2942e068863ce2a8491bb71522c652f31fb466 in /
運行容器后成功打印出Hello World后容器直接退出。容器狀態為Exited(0)。此時容器啟動的主進程為橙色標記部分
[root@localhost docker]# docker run --name cmd test:cmd
hello World
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bc94359c4fd test:cmd "echo 'hello World'" 4 seconds ago Exited (0) 3 seconds ago cmd
若想讓容器一直up狀態,方便進入容器進一步操作,需要使用掛起命令覆蓋CMD ["echo","hello World"],
方法1:在命令中增加綠色高亮部分代碼(額外增加-it選項可直接進入容器)。進入容器成功
[root@localhost docker]# docker run -it --name upcontainer test:cmd /bin/bash
[root@9351844319e3 /]#
更換tty窗口,查看容器狀態Up。此時容器啟動的主進程入橙色標記部分,說明覆蓋CMD成功
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9351844319e3 test:cmd "/bin/bash" 11 seconds ago Up 10 seconds upcontainer
方法2:在命令中增加綠色高亮部分代碼(額外增加-it選項可直接進入容器)。進入容器成功
[root@localhost docker]# docker run --name upcontainer -it --entrypoint /bin/bash test:cmd
[root@50763cf9a838 /]#
更換tty窗口,查看容器狀態Up。此時容器啟動的主進程入橙色標記部分,說明覆蓋CMD成功
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
50763cf9a838 test:cmd "/bin/bash" About a minute ago Up About a minute upcontainer
ENTRYPOINT
FROM centos:latest
MAINTAINER quanling
ENTRYPOINT ["echo","Hello World"]
如果使用上面的文件創建鏡像test:ENTRYPOINT
運行容器后成功打印出Hello World后容器直接退出。容器狀態為Exited(0)。此時容器啟動的主進程入橙色標記部分
[root@localhost docker]# docker run --name ENTRYPOINT test:ENTRYPOINT
Hello World
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6cf335c5c09 test:ENTRYPOINT "echo 'Hello World'" 8 seconds ago Exited (0) 6 seconds ago ENTRYPOINT
若想讓容器一直up狀態,方便exec進入容器進一步操作,需要使用掛起命令覆蓋ENTRYPOINT["echo","hello World"],模仿上面的操作,結果如下,容器Exited狀態(--no-trunc顯示全輸出信息)
[root@localhost docker]# docker run --name upcontainer test:ENTRYPOINT /bin/bash
Hello World /bin/bash[root@localhost docker]# docker ps -a --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0476c3014fa4c28615b72c231971c6b5186a310f9b2f5cae466643d65b236c34 test:ENTRYPOINT "echo 'Hello World' /bin/bash" 2 minutes ago Exited (0) 2 minutes ago upcontainer
e6cf335c5c09df35845f40abfd81594e17b3457891128ee2108414d7573e62a3 test:ENTRYPOINT "echo 'Hello World'" 7 minutes ago Exited (0) 7 minutes ago ENTRYPOINT
我們想執行的掛起命令并未覆蓋ENTRYPOINT命令,反而作為echo命令的參數部分一起輸出了。因為覆蓋ENTRYPOINT命令需要使用--entrypoint設置(額外增加-it選項可直接進入容器),進入容器成功。
[root@localhost docker]# docker run -it --entrypoint /bin/bash --name upcontainer test:ENTRYPOINT
[root@4fe14a5e7bd1 /]#
更換tty窗口,查看容器狀態Up。此時容器啟動的主進程入橙色標記部分,說明覆蓋ENTRYPOINT成功
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4fe14a5e7bd1 test:ENTRYPOINT "/bin/bash" 11 seconds ago Up 10 seconds upcontainer
e6cf335c5c09 test:ENTRYPOINT "echo 'Hello World'" 14 minutes ago Exited (0) 14 minutes ago ENTRYPOINT
ENTRYPOINT&CMD
FROM centos:latest
MAINTAINER quanling
ENTRYPOINT ["echo"]
CMD ["hello World"]
如果使用上面的文件創建鏡像test:mixed。使用history命令查看容器主進程命令,下方橙色標記部分
[root@localhost docker]# docker history --no-trunc test:mixed
IMAGE CREATED CREATED BY SIZE COMMENT
sha256:2c1f8303382cb221fac04a76234d0b1afe3a513205267afe2d01f39006877be8 24 seconds ago /bin/sh -c #(nop) CMD ["hello World"] 0B
sha256:13608f257d7b6d1ae771af1aec482b7b87650703648a4ac5c03e8715f78c0079 25 seconds ago /bin/sh -c #(nop) ENTRYPOINT ["echo"] 0B
sha256:6dcafb4f0c8d93e8793f84bb837ef26ed6293c156dafafbbc520e55ed601a09e 2 hours ago /bin/sh -c #(nop) MAINTAINER quanling 0B
sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20210915 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0326ca33fd2942e068863ce2a8491bb71522c652f31fb466 in / 231MB
運行容器后成功打印出Hello World后容器直接退出。容器狀態為Exited(0)。此時容器啟動的主進程為橙色標記部分
[root@localhost docker]# docker run --name mixed test:mixed
hello World
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22362d314132 test:mixed "echo 'hello World'" 4 seconds ago Exited (0) 3 seconds ago mixed
若想讓容器一直up狀態,方便進入容器進一步操作,需要覆蓋Etrypoint和CMD中命令,在命令中增加綠色高亮部分代碼(額外增加-it選項可直接進入容器)。查看執行結果
[root@localhost docker]# docker run -it --name upcontainer test:mixed /bin/bash
/bin/bash
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
df18afb54646 test:mixed "echo /bin/bash" 6 seconds ago Exited (0) 5 seconds ago upcontainer
22362d314132 test:mixed "echo 'hello World'" 3 minutes ago Exited (0) 3 minutes ago mixed
執行發現容器為Exited狀態,打印出“/bin/bash”后容器退出。說明該操作僅僅覆蓋了CMD ["hello World"]部分,保留了ENTRYPOINT ["echo"]部分。正確的操作應該使用--entrypoint設置(額外增加-it選項可直接進入容器),進入容器成功。
[root@localhost docker]# docker run -it --entrypoint /bin/bash --name upcontainer test:mixed
[root@deb56cf88e89 /]#
更換tty窗口,查看容器狀態Up。此時容器啟動的主進程入橙色標記部分,說明覆蓋ENTRYPOINT成功
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
deb56cf88e89 test:mixed "/bin/bash" About a minute ago Up About a minute upcontainer
22362d314132 test:mixed "echo 'hello World'" 8 minutes ago Exited (0) 8 minutes ago mixed
docker-compose中的覆蓋主進程命令
有些容器是使用docker-compose來啟動容器的,按照Dockerfile文件的不同,docker-compose中的修改不同,覆蓋命令 tail -f /dev/null
利用上面三個鏡像,編寫docker-compose.yml文件
version: '3'
services:
cmd:
image: test:cmd
container_name: cmd
ENTRYPOINT:
image: test:ENTRYPOINT
container_name: ENTRYPOINT
mixed:
image: test:mixed
container_name: mixed
啟動三個鏡像的服務容器,都執行后退出Exited狀態。容器主進程見下方橙色高亮部分
[root@localhost docker]# docker-compose up -d
Starting cmd ... done
Creating ENTRYPOINT ... done
Creating mixed ... done
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7519cbfb6ef8 test:mixed "echo 'hello World'" 40 seconds ago Exited (0) 36 seconds ago mixed
d1c2709a0173 test:ENTRYPOINT "echo 'Hello World'" 40 seconds ago Exited (0) 36 seconds ago ENTRYPOINT
e2206ea2cfc1 test:cmd "echo 'hello World'" 2 minutes ago Exited (0) 37 seconds ago cmd
Entrypoint命令
在docker-compose.yaml 文件中每個服務下添加以下綠色高亮區域命令,以覆蓋原來docker中的命令
version: '3'
services:
cmd:
image: test:cmd
container_name: cmd
entrypoint:
- tail
- -f
- /dev/null
ENTRYPOINT:
image: test:ENTRYPOINT
container_name: ENTRYPOINT
entrypoint:
- tail
- -f
- /dev/null
mixed:
image: test:mixed
container_name: mixed
entrypoint:
- tail
- -f
- /dev/null
重新啟動容器,容器全部為up狀態,主程序命令被替換為"tail -f /dev/null"
[root@localhost docker]# docker-compose up -d
Starting mixed ... done
Starting cmd ... done
Recreating ENTRYPOINT ... done
[root@localhost docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d4682226bb0 test:cmd "tail -f /dev/null" 4 seconds ago Up 2 seconds cmd
c3870ab0d462 test:mixed "tail -f /dev/null" 31 seconds ago Up 28 seconds mixed
7320deecd45a test:ENTRYPOINT "tail -f /dev/null" 59 seconds ago Up 55 seconds ENTRYPOINT
在docker-compose.yaml 文件中每個服務下添加以下綠色高亮區域命令
version: '3'
services:
cmd:
image: test:cmd
container_name: cmd
command: tail -f /dev/null
ENTRYPOINT:
image: test:ENTRYPOINT
container_name: ENTRYPOINT
command: tail -f /dev/null
mixed:
image: test:mixed
container_name: mixed
command: tail -f /dev/null
重新啟動容器,查看容器狀態,及主程序命令
[root@localhost docker]# docker-compose up -d
cmd is up-to-date ... done
Recreating ENTRYPOINT ... done
Recreating mixed ... done
[root@localhost docker]# docker ps -a --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf67da0ba9815a013a2005d61daa223e31586bf1cde279933ba71d0148c721ff test:mixed "echo tail -f /dev/null" About a minute ago Exited (0) About a minute ago mixed
f019610b1aedb54904704227ae661f421786b72ecc9e3b35154442c4717afcb0 test:ENTRYPOINT "echo 'Hello World' tail -f /dev/null" About a minute ago Exited (0) About a minute ago ENTRYPOINT
224bc6db4563531c68947a38acbf3418c43149b2ef6a92565f940a98ab1a9b1e test:cmd "tail -f /dev/null" 10 minutes ago Up 10 minutes cmd
分析結論
使用commad命令,結果僅test:cmd中命令被替換;test:Entrypoint鏡像未被覆蓋,且commad命令作為參數傳入;test:mixed鏡像僅CMD部分命令被替換,ENTRYPOINT部分未被替換。與docker run運行結果一致。
補充
容器up狀態時,執行exec命令進入容器
# docker exec -it 容器名 /bin/bash
容器內查看相關配置是否符合預期,手動執行鏡像原entrypoint/cmd命令跟著日志進行調試
鏡像往往很精簡,不包含yum、vi 等命令,導致需要修改配置進行調試受阻,除安裝所需命令這個麻煩的方法外,還可以在容器外使用docker cp命令
$ docker cp 容器名:文件完整路徑 本地路徑 #容器內文件copy到本地
$ docker cp 本地文件容器名:文件完整路徑 #本地文件copy到容器內
$ docker run -it --rm --entrypoint="" 容器名 /bin/bash
原文鏈接:https://www.cnblogs.com/sylvia-liu/p/14933776.html
相關推薦
- 2022-03-23 C語言實現簡單的三子棋游戲源碼_C 語言
- 2022-06-30 python實現水印圖片功能_python
- 2022-05-23 Android利用Palette實現提取圖片顏色_Android
- 2022-09-06 詳解golang?defer?閉包?匿名函數_Golang
- 2022-06-09 ASP.NET?Core中的Configuration配置二_基礎應用
- 2023-01-12 Python讀取及保存mat文件的注意事項說明_python
- 2022-05-06 Windows如何關閉被占用的端口
- 2022-09-26 tomcat下載安裝及配置環境變量,但打開startup文件出現閃退問題解決方法
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支