关注分享主机优惠活动
国内外VPS云服务器

Docker容器直接退出如何进入容器调试模式(退出docker容器命令)

启动容器并直接退出。想进入容器调试,应该怎么做?

用过docker的朋友大概都会遇到docker启动容器失败或者执行后直接退出的情况。想进入容器手动执行命令调试应该怎么做?

docker容器启动失败通常是由于主进程退出造成的。主进程启动命令通常由镜像Dockerfile文件末尾的ENTRYPOINT或CMD定义。此时,您可以覆盖主进程启动命令并替换一个挂起的命令。我经常使用挂起命令:/bin/bash

所以我们需要解决的核心问题是:如何使用suspend命令来覆盖ENTRYPOINT或者CMD定义的容器主进程命令?

以上结论(适用于所有图像)1。docker run -IT --entry point/bin/bash image,执行后直接进入容器。

2.如果docker-compose启动容器,需要修改docker-compose.yml文件,在对应的服务下添加如下高亮显示的信息;然后docker-compose又上来了。

版本:' 3 '服务:cmd:image:mirror container _ name:container name entry point:-tail --F-/dev/null执行命令进入容器docker exec -it container name/bin/bash

以下是详细的分析过程:

看看镜像的dockerfile文件(Docker History --No-TruncImage)检查一下容器启动主进程的最后一个命令是什么样子的,ENTRYPOINT?CMD?还是两者的结合?覆盖范围略有不同。为了便于演示,我构造了一个简单的Dockerfile文件作为案例。

Docker RUN覆盖容器主进程命令docker run用-it交互参数覆盖命令/bin/bash。

Cmdfrom centos:最新维护者quanlingcmd ["echo "," hello world"]如果使用上面的文件创建镜像测试:cmd,使用history命令查看容器主进程命令,以及下面橙色标记的部分。

[root @ localhost docker]# docker history --no-trunc test:CMD image CREATED由SIZE comments ha 256:694 D5 F2 d 8809 ef 2847 a 9 b 6 FD 46 efed 49 ab 59 aa 6466784 a 1 e 783 beb 25 C2 F6 c 16 e 31秒前/bin/sh -c#(nop)CMD[" echo " " hello World "]0B sha 256:6 dcafb 4 f 0 c 8d 93缺少& gt3个月前/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 = GPL v2 org . LABEL -schema . build -date = 2021 09 15 0B & lt;缺少& gt3个月前/bin/sh -c #(nop)添加文件:805 c b 5 e 15 FB 6 E0 bb 0326 ca 33 FD 2942 e 06863 ce 2 a 8491 bb 71522 c 652 f 31 FB 466 in/运行容器后成功打印出Hello World,然后容器直接退出。容器状态为现有(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 6 BC 94359 c4fd test:CMD " ech O ' hello World ' " 4秒前存在(0) 3秒前CMD如果要保持容器运行并进入容器进行进一步操作,需要使用suspend命令覆盖CMD[& quot;回声& quot,& quot你好世界& quot],

1:在命令中添加绿色突出显示的代码(添加-it选项直接进入容器)。成功进入集装箱。

[root @ localhost docker]# docker run -it--name Up容器测试:cmd/bin/bash[root @ 9351844319 E3/]#替换tty窗口并检查容器状态Up。此时,容器启动的主进程以橙色标记,表示CMD被成功覆盖。

[root @ localhost ~]# docker PS -a container ID IMAGE命令创建状态端口名称9351844319 E3 test:cmd "/Bin/bash " 11秒前up 10秒up容器方法二:在命令中添加绿色高亮显示的代码(添加-it选项直接进入容器)。成功进入集装箱。

[root @ localhost docker]# docker run --name Up container -it--entry point/bin/bash test:cmd[root @ 50763 cf 9a 838/]#替换tty窗口并检查容器状态Up。此时,容器启动的主进程以橙色标记,表示CMD被成功覆盖。

[root @ localhost ~]# docker PS container ID IMAGE命令在大约一分钟前创建了名为50763cf9a838 test:cmd "/bin/ bash "的状态端口

来自Centos:最新维护者quanlingentrypoint ["echo "," hello world"]如果使用上述文件创建镜像测试:entrypoint

容器运行成功后,打印出Hello World,然后容器直接退出。容器状态为现有(0)。此时,容器启动的主进程进入橙色标记的部分。

[root @ localhost docker]# docker run --name ENTRYPOINT test:entry point hello World[root @ localhost docker]# docker PS -a container ID IMAGE COMMAND CREATED STATUS PORTS name se 6 cf 335 C5 c 09 test:ENT ry point " echo ' hello World " 8秒前现有(0)6秒前entry point如果您想让容器一直保持运行,以便exec可以进入容器进行进一步的操作,您需要使用suspend命令来覆盖entry point[& quot;回声& quot,& quot你好世界& quot],模仿上面的操作,结果如下,容器存在(--no-trunc显示完整的输出信息)

[root @ localhost docker]# docker run --name up container test:entry point/bin/bash Hello World/bin/bash[root @ localhost docker]# docker PS -a --no-trunc container ID IMAGE命令创建的状态端口名称0476 c 3014 fa 4c 28615 b 72 c 231971 c 6b 5186 a 310 f 9 b 2 f 5 ca e466643 d 65 b 236 c 34 test:entry point " echo因为override ENTRYPOINT命令需要使用--entrypoint设置(添加-it选项可以直接进入容器),所以进入容器是成功的。

[root @ localhost docker]# docker run -it--entry point/bin/bash --name Up容器测试:entry point[root @ 4 Fe 14 a 5 e 7 BD 1/]#替换tty窗口并检查容器状态Up。此时,容器启动的主进程被标记为橙色,表示入口点被成功覆盖。

[root @ localhost ~]# docker PS -a container ID IMAGE命令创建的状态端口名称4 Fe 14 a 5 E 7 BD 1 test:E ntry point "/bin/bash " 11秒前Up 10秒Up container 6 cf 335 C5 c 09 test:entry point " echo ' Hello World " " 14分钟前E exit(0)14分钟前ENTRYPOINTENTRYPOINT & amp煤矿管理局

来自centos:最新维护者quanlingentrypoint[" echo "]cmd[" hello world "]如果使用上述文件创建镜像测试:混合。使用历史命令查看容器主进程命令,即下面橙色标记的部分。

[root @ localhost docker]# docker history --no-trunc test:mixed image CREATED BY SIZE comments ha 256:2 C1 f 8303382 CB 221 fac 04 a 76234d 0 B1 AFE 3a 513205267 AFE 2d 01 f 39006877 be 8 24秒前/bin/sh -c#(nop)CMD[" hello World "]0B sha 256:13608 f 257d 7 b 6缺少& gt3个月前/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 = GPL v2 org . LABEL -schema . build -date = 2021 09 15 0B & lt;缺少& gt3个月前/bin/sh -c #(nop)添加文件:805 CB 5 e 15 FB 6 E0 bb 0326 ca 33 FD 2942 e 068863 ce 2 a 8491 bb 71522 c 652 f 31 FB 466 in/运行容器231MB后,容器成功打印出Hello World,然后容器直接退出。容器状态为现有(0)。此时,容器启动的主进程用橙色标记。

[root @ localhost docker]# docker run --name混合测试:mixed hello World[root @ localhost docker]# docker PS -a container ID IMAGE命令创建的状态端口名称22362d314132测试:mixed "e Cho' hello world' "4秒前存在(0) 3秒前混合如果要保持容器运行并进入容器进行进一步操作,需要覆盖Etrypoint和CMD中的命令,并在命令中添加绿色突出显示代码(您可以通过检查执行结果。

[root @ localhost docker]# docker run -it --name up container test:mixed/bin/bash/bin/bash[root @ localhost docker]# docker PS -a container ID IMAGE COMMAND CREATED STATUS PORTS names df 18 AFB 54646 test:mixed " echo/bin/bash " 6秒前退出(0) 5秒前up container 22362d 314132 test:mixed " echo ' hello world ' " 3分钟前现有(0)3分钟前混合执行和查找/bin/bash & rdquo;后集装箱出口。说明这个操作只覆盖CMD[& quot;你好世界& quot]部分,entry point[& quot;回声& quot]部分。正确的操作应该是使用--entrypoint设置(添加-it选项直接进入容器),进入容器成功。

[root @ localhost docker]# docker run -it--entry point/bin/bash --name Up容器测试:mixed [root @ deb56cf88e89/] #替换tty窗口并检查容器状态Up。此时,容器启动的主进程被标记为橙色,表示入口点被成功覆盖。

[root @ localhost ~]# docker PS -a container ID IMAGE命令创建的状态端口名称db 56 cf 88 e 89 test:mix ed "/bin/bash "大约一分钟前Up大约一分钟前Up container 22362d 314132 test:mix ed " echo ' hello World " 8分钟前退出(0) 8分钟前mixed

覆盖docker-compose中的主进程命令有些容器是由docker-compose启动的。根据不同的Dockerfile文件,docker-compose中的修改是不同的。覆盖命令尾-f /dev/null。

使用上述三个图像,编写docker-compose.yml文件。

版本:“3”服务:cmd:image:test:cmd container _ name:cmd entry point:image:test:entry point container _ name:entry point mixed:I image:test:mixed container _ name:mixed启动三个镜像服务容器,执行后都退出现有状态。请参见下面橙色突出显示的主容器流程。

[root @ localhost docker]# docker -组成-dStarting cmd...完成创建入口点...完成创建混合...done[root @ localhost docker]# docker PS -a container ID IMAGE命令已创建状态端口名称7519cbfb6ef8测试:m混合“echo ' Hello World””40秒前退出(0) 36秒前混合1c2709a0173测试:入口点“echo ' Hello World””40秒前退出(0) 36秒前入口点2206ea2cfc1测试:cmd“echo ' Hello World””2分钟前退出(0)cmd

entry命令在docker-compose.yaml文件中的每个服务下添加以下绿色突出显示的区域命令,以覆盖docker中的原始命令。

版本:“3”服务:cmd:image:test:cmd container _ name:cmd entry point:-tail --F-/dev/Null entry point:image:test:entry point container _ name:entry point:-tail --F-/dev/Null mixed:image:test:mixed container _ name:mixed entry point:-tail --F-/dev/Null重新启动容器,所有容器都处于up状态,主程序命令替换为“tail 4

[root @ localhost docker]# docker -构成-数据开始混合...完成启动cmd...完成重新创建入口点...done[root @ localhost docker]# docker PS -a container ID IMAGE命令已创建状态端口名称2d4682226bb0测试:cmd " tail -f /dev/null" 4秒前向上2秒cmdc3870ab0d462测试:混合" tail -f /dev/ null" 31秒前向上28秒混合7320deecd45a测试:ENTRYPOINT "tail -f /dev/ Null "59秒前向上55秒入口点添加以下绿色

版本:“3”服务:cmd:image:test:cmd container _ name:cmd命令:tail -f /dev/ null入口点:image:test:entry point container _ name:entry point命令:tail -f /dev/ Null混合:image:test:mixed container _ name:mixed命令:tail-f/dev/null重新启动容器,检查容器状态,以及主程序命令。

[root @ localhost docker]# docker -构成-dcmd是up-到-的日期...完成重新创建入口点...混合的...done[root @ localhost docker]# docker PS -a --no-trunc container ID IMAGE命令已创建状态端口名称sbf 67 da 0 ba 9815 a 013 a 2005d 61 da a223 e 31586 BF 1 CDE 279933 ba 71d 0148 c 721 ff测试:大约一分钟前混合了“echo tail -f /dev/null”退出(0)大约一分钟前混合了019610 B1 aedb 5490477

结论分析中使用了Command命令,仅替换了test:cmd中的命令。测试:Entrypoint mirror不被覆盖,command命令作为参数传入;测试:混合镜像只替换命令的CMD部分,但ENTRYPOINT部分不替换。与docker运行的运行结果一致。

当补充集装箱up状态时,执行exec命令进入集装箱。

# docker exec -it容器名/bin/bash容器检查相关配置是否符合预期,手动执行mirror original entrypoint/cmd命令用日志调试。

镜像往往非常简洁,不包含yum、vi等命令,导致调试需要修改配置。除了安装所需命令的麻烦方法之外,您还可以在容器外部使用docker cp命令。

$ docker cp容器名称:完整文件路径本地路径#将容器中的文件复制到本地

$ docker cp本地文件容器名:完整文件路径#将本地文件复制到容器中

$ docker run -it --RM --entry point = & quot;"容器名称/bin/bash

关于docker容器直接退出,如何进入容器调试的这篇文章到此为止。关于docker容器直接退出的更多信息,请搜索主机频道zhujipindao之前的文章。或者继续浏览下面的相关文章。希望大家支持主机频道zhujipindao。以后多来com!

未经允许不得转载:主机频道 » Docker容器直接退出如何进入容器调试模式(退出docker容器命令)

评论 抢沙发

评论前必须登录!