如何在宿主机上获取无法启动容器的内部命令执行历史
宿主机侧获取无法启动容器的内部命令历史方案
前置说明:以下方案生效前提是故障容器未被删除(可通过docker ps -a查询到记录),且容器内使用的shell默认开启了历史记录落盘(绝大多数基础镜像的bash/zsh/ash等shell默认会将执行过的命令写入用户家目录下的历史文件)
方法1:直接读取容器可写层的历史文件(最稳定高效)
- 第一步先获取故障容器的ID,执行
docker ps -a找到目标容器对应的CONTAINER ID,若使用podman则将以下命令中的docker替换为podman即可 - 直接通过inspect命令拿到容器可写层在宿主机上的真实路径,不需要手动翻存储目录:
命令输出的路径即为容器可写层的根目录,例如输出docker inspect <故障容器ID> | grep UpperDir"UpperDir": "/var/lib/docker/overlay2/abc123def456/diff",则根路径为/var/lib/docker/overlay2/abc123def456/diff - 进入上述根路径后,根据执行命令的容器内用户身份,找到对应shell历史文件:
- 容器内root用户执行的命令,历史文件默认路径为
<UpperDir路径>/root/.bash_history,若使用zsh则为.zsh_history,alpine基础镜像默认使用ash对应.ash_history - 容器内普通用户执行的命令,历史文件默认路径为
<UpperDir路径>/home/<容器内用户名>/.bash_history
- 容器内root用户执行的命令,历史文件默认路径为
- 直接通过
cat、less等命令读取对应历史文件,即可查到容器内过往执行的所有落盘命令,包括你之前执行的kill -9操作记录。
方法2:导出容器文件系统后检索历史文件(适合不熟悉存储结构的场景)
如果不想手动定位存储层路径,可以直接将故障容器的完整文件系统导出为压缩包后检索:
- 执行导出命令:
docker export <故障容器ID> -o broken_container.tar - 解压导出的tar包后,按照方法1中提到的家目录路径,查找对应shell历史文件读取即可。
补充方法:查询容器运行日志获取残留记录
如果容器使用默认的json-file日志驱动,可以通过logs命令查看容器主进程、exec进程的输入输出残留,该方法仅能拿到部分带tty交互的命令片段,无法获取全量历史,仅作为补充手段:
docker logs <故障容器ID>
注意:如果容器内曾手动设置
HISTSIZE=0/HISTFILESIZE=0关闭了历史记录,或者执行命令时配置了HISTCONTROL=ignorespace且命令前带空格前缀,对应命令不会写入历史文件,这类情况无法通过落盘文件找回记录。
内容的提问来源于stack exchange,提问作者mayur murkya
相关产品推荐
相关产品推荐

