问题描述
在我们build镜像时,经常会发现一种情况,就是不知道为啥,镜像一直在Restarting/exit,这时通过传统的 docker exec 无法进入容器查看内部情况,那么这种情况如何能进入呢?
问题解决
方案1
亲测有效,但是这种方案会多出一个镜像,如果需要更改镜像内部内容,需要在临时镜像的基础上,继续commit一个新的镜像。所以此方案进行内容修改的话,需要操作步骤较多,不推荐。但是如果仅看镜像内部结构的话,还是比较好的。
docker commit 容器ID tmpTAG
docker exec -it tmpTAG sh
方案2
亲测有效,比较推荐这种方案,可以直接进入原镜像去修改内容,然后重启即可
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host 镜像hash /bin/sh
上述两种方案均在ubutu环境中进行测试,其他系统需自行测试。看网上其他方案,方案2如果在winows中使用,需要先下载一个镜像并启动(未经过测试),然后在进行方案2中所述步骤
docker run --privileged -it -v /var/run/docker.sock:/var/run/docker.sock jongallant/ubuntu-docker-client
方案3
此中方案仅适合想直接修改docker中容器内容,页比较麻烦,不太推荐
docker cp [容器id]:docker容器中配置文件路径 主机路径
docker cp 主机文件路径 容器id:docker容器中配置文件路径
总结
当镜像一直处于Restarting/exit状态时,无法通过传统的docker exec进入容器查看内部情况。为此,我们可以采用三种方案解决问题。方案1是先将容器commit成临时镜像,再通过docker exec进入,但是这样会多出一个镜像,不太推荐。方案2是直接通过docker run命令进入原镜像,进行内容修改后重启即可。方案3则是通过docker cp命令将容器中的配置文件复制到主机上进行修改,再将修改后的文件复制回容器中。总之,针对Restarting/exit状态的镜像,我们可以采用不同的方案来解决问题,选择最适合自己的方案即可。