目录标题
概要
已执行的 docker run
命令无法直接从 Docker 守护进程的日志中回放原始命令行参数,但可以通过以下几种方式 (1) 从 Shell 历史中检索 (2) 通过 Docker 客户端命令查看容器的启动配置 (3) 借助审计/事件日志获取部分元数据。下面分别介绍三种常用方法,并附上对应命令和示例。
1. 从 Shell 历史检索已执行命令
如果你是通过交互式 Shell(如 Bash、Zsh)执行的 docker run
,那么你的命令会被记录到相应的历史文件中。
-
Bash:
history | grep 'docker run'
这条命令会列出所有历史记录中包含
docker run
的条目 (DEV Community)。 -
直接查看文件:
grep 'docker run' ~/.bash_history
或者如果你使用 Zsh,可替换为
~/.zsh_history
(Ask Ubuntu)。 -
注意:
- Bash 会在 shell 退出时才写入
~/.bash_history
,如果命令尚未写入可先运行history -a
强制追加 (数字海洋)。 - 如果是在 CI/CD 脚本或无交互环境中执行,可能并未记录在 Shell 历史,此时需辅以下面的方法。
- Bash 会在 shell 退出时才写入
2. 通过 Docker 客户端查看容器启动参数
即便你忘记了命令本身,Docker 会在容器元数据中保留启动时的 ENTRYPOINT
、CMD
、端口映射等信息:
2.1 docker ps
+ --no-trunc
docker ps --all --no-trunc --format '{{.ID}} {{.Command}}'
--no-trunc
会显示完整的命令行(包括入口点和参数) (Stack Overflow)。--format '{{.ID}} {{.Command}}'
只输出容器 ID 和对应命令,便于过滤和查找 (Docker Documentation)。
2.2 docker inspect
精确提取
docker inspect --format='{{.Name}} {{.Path}} {{range .Args}}{{.}} {{end}}' <容器ID或名称>
-
.Path
对应启动时的可执行文件(ENTRYPOINT),.Args
是传入的参数列表 (Spacelift)。 -
同理,也可单独获取镜像层面的默认
CMD
:docker inspect -f '{{.Config.Cmd}}' <镜像:标签>
3. 借助事件日志和审计跟踪
当以上方案均不可用时,仍可从 Docker 事件流或系统审计中获取容器创建时间、ID 等线索,但无法完美还原所有参数:
3.1 docker events
docker events --since '2025-05-18' --filter event=create --filter container=<容器ID>
- 可查看最近若干天内的容器创建事件,带时间戳和容器元数据,但不包含完整命令行 (Docker Documentation)。
3.2 journald / 审计日志
-
journald(若 Docker 由 systemd 管理):
journalctl -u docker.service | grep 'CreateContainer'
可看到创建事件,但同样不含全部 CLI 参数。
-
auditd:
添加对 dockerd 的execve
系统调用审计规则,可记录守护进程执行的二进制及参数:auditctl -a exit,always -F arch=b64 -S execve -F path=/usr/bin/dockerd -k dockerd-exec ausearch -k dockerd-exec
该方案能捕获
dockerd
自身的调用日志,间接反映子命令,但配置复杂且需要提前启用 (Stack Overflow)。
小结与选型建议
- 最简单有效:优先从当前用户的 Shell 历史文件中
grep 'docker run'
恢复命令历史(如果命令执行者与历史同步正常) (DEV Community)。 - 容器元数据:若历史丢失,可通过
docker ps --no-trunc
+docker inspect
精确提取当时启动容器的入口点和参数 (Stack Overflow, Spacelift)。 - 审计与事件:在安全合规或运维场景下,可事先开启审计或收集
docker events
,以便后续排查;但该方式仅辅助,无法完全返还原始命令。
结合这些方法,你可以在大多数情况下找回或重构已执行的 docker run
命令,便于审计、文档或重放。