容器跑久了之后,谁、用什么参数起的经常说不清。docker inspect 能看到参数但格式反人类,没有一个工具能直接还原成 docker run 命令就是问题。
社区里有三个工具专门干这事:cucker/get_command_4_run_container、assaflavie/runlike、joinsunsoft/runcommand。这一篇把它们的使用、差异、坑点一次性说清楚。
阅读对象:需要批量迁移容器、查历史启动参数、自动化复现容器配置的运维 / 开发者 覆盖范围:三个工具的对比 + 实战演示 + 自定义 alias + 边界场景
一、问题:为什么"看启动参数"这么难
docker inspect 能看所有配置,但输出的 JSON 字段名和 docker run 参数不一一对应:
| |
要把这些反向工程成 docker run -d --name mysql01 -p 13306:3306 -e MYSQL_ROOT_PASSWORD=py123456 mysql,光看 JSON 就要在脑子里做几层翻译。三个工具就是干这个的。
二、cucker/get_command_4_run_container
最老牌、用得最多的工具,Docker Hub 上被 pull 了 100w+ 次。
2.1 拉取 + 跑
| |
关键点:
--rm——跑完就删容器-v /var/run/docker.sock:/var/run/docker.sock——挂载 docker daemon 的 socket,让容器内的工具能跟宿主机的 daemon 通信
2.2 输出示例
| |
直接复制粘贴就能跑。
2.3 配合 alias 用
| |
三、assaflavie/runlike
另一个流行工具,和 cucker 类似但输出格式略有不同。
3.1 用法
| |
3.2 差异
| 维度 | cucker | runlike |
|---|---|---|
| 输出格式 | docker run -d \\\n --name xxx \\\n ... | docker run -d --name xxx ...(一行) |
| 命名 | 短名(mysql01) | FQDN(/mysql01,带斜杠) |
| 网络 | --network=bridge | --network=bridge |
| 多网络 | 部分支持 | 支持更全 |
| 维护 | 偶尔更新 | 较活跃 |
四、joinsunsoft/runcommand
第三个工具,相对小众,但支持输出 docker-compose 格式。
| |
特色:能输出 YAML 格式的 docker-compose 配置。
五、批量还原所有容器
| |
典型场景:接手一个"无文档"的 Docker 主机,用这个脚本快速还原整个部署。
六、还原 Docker Compose 配置
cucker 输出的是 docker run 单条命令。如果容器是用 docker-compose up 启动的,实际配置在 docker-compose.yml 里——还原不回来。
变通方案:
| |
或者用社区脚本 rekcod:
| |
七、常见坑
7.1 permission denied 挂载 socket
| |
解决:
- Linux:当前用户在
docker用户组里,或者用sudo - Mac/Windows (Docker Desktop):socket 路径在 VM 里,默认配置应该 OK
| |
7.2 还原出来的命令跑不起来
Why:
- 镜像已被删除(
docker rmi过) - 网络 / 卷不存在
- 端口冲突
cucker / runlike 只还原配置,不还原前置依赖。先验证镜像还在:
| |
7.3 容器里有 bind mount 到宿主机路径
cucker 还原的命令会保留 -v /host/path:/container/path,但如果目标宿主机上 /host/path 不存在,启动会失败。
配合 creates 标记:
| |
7.4 docker run 输出和 docker-compose.yml 不一样
实例:
| |
Why 不一样:
- compose 会自动加
--name <project>_<service>_<index>(如project_nginx_1)- compose 自动加
com.docker.compose.*标签- bind mount 的相对路径变成绝对路径
生产建议:别用 cucker 还原 compose 启动的容器——直接读 compose 文件最准。
八、工具对比
| 维度 | cucker | runlike | runcommand | rekcod |
|---|---|---|---|---|
| 输出格式 | docker run | docker run | docker run | docker-compose |
| 镜像大小 | ~30MB | ~20MB | ~25MB | ~30MB |
| 多网络支持 | 部分 | 是 | 是 | 是 |
| 维护活跃 | 偶尔 | 活跃 | 少更新 | 活跃 |
| 推荐 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
九、最佳实践
- 核心生产环境:写好
docker-compose.yml+ Git 版本管理——别依赖"事后还原" - 应急查命令:
cucker/runlike一键还原 - 批量盘点:用 for 循环扫所有容器,输出成文档
- 不要把"还原命令"作为"日常运维工具"——SSoT 应该是 compose 文件 / K8s manifest
十、要点回顾
- cucker / runlike / runcommand / rekcod 是社区主流的"反查启动命令"工具
- 必须挂载
/var/run/docker.sock——容器内的工具才能跟 daemon 通信 - 还原的命令可能不能直接跑——镜像删除 / 路径不存在 / 端口冲突都常见
- compose 启动的容器还原出来是 docker run 格式——不是 compose
- 生产 SSoT 应该是 compose / K8s manifest——还原工具只应急
十一、小结
“还原启动命令"是接手历史部署、自动化盘点、应急迁移的利器。但最佳实践仍然是把启动配置写在文件里——docker-compose.yml / K8s manifest,让 Git 成为 SSoT。
下一步:理解了"还原单条启动命令”,下一步是"还原整套部署"——
rekcod风格的 docker-compose 还原、Helm chart 模板化、Kustomize 跨环境覆盖——把"凭记忆启动"变成"声明式部署"。
