runlike解决:从docker run容器读取docker run命令

runlike 是一个 Docker 容器“反向生成 docker run 命令”的工具。

它会读取docker inspect中的配置,然后还原出docker run …

适用于:

  • 容器迁移
  • 容器备份
  • docker run 参数恢复
  • 从历史容器生成启动脚本
  • bind mount 修改
  • docker-compose 转换前分析
  • 灾难恢复

本质上:

1
container metadata -> docker run command

1.安装runlike

1.1pip安装runlike

1
pip install runlike

或者:

1
2
pip3 install runlike
pip3 install runlike -i https://pypi.tuna.tsinghua.edu.cn/simple

验证:

1
runlike --version

1.2 Docker 方式运行

如果宿主机不想安装 Python 包:

1
2
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
assaflavie/runlike <container>

例如:

1
2
3
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
assaflavie/runlike nginx

2.基本用法

2.1 查看容器启动命令

1
runlike redis  # runlike container_name/id

输出:

1
2
3
4
5
6
7
8
docker run \
--name=redis \
--hostname=8d0c3f1f8f3c \
--mac-address=02:42:ac:11:00:02 \
--env=REDIS_VERSION=7.2 \
--volume=/data/redis:/data \
--publish=6379:6379 \
redis:7

3.典型应用场景

3.1 迁移 bind mount

1
-v /home/crabai/redis:/data  -> -v /data/docker-data/redis:/data

流程:

flowchart LR

A[runlike 导出] --> B[修改 volume]
B --> C[删除旧容器]
C --> D[重新运行]

3.2导出docker run运行命令

旧服务器:

1
2
runlike mysql > mysql.sh
runlike -p nginx # 格式化

新服务器:

1
2
#bash mysql.sh
建议根据实际情况修正,或者转docker-compose.yml

快速恢复。


4.runlike 内部原理

它本质读取:docker inspect

然后映射:

inspect 字段 docker run 参数
Env –env
Mounts -v
Ports -p
RestartPolicy –restart
NetworkMode –network
Cmd command
Entrypoint –entrypoint
最终拼接。

5.runlike 的局限性

不能 100% 还原,有些内容恢复不了:

内容 原因
shell history Docker 不保存
动态 entrypoint 行为 inspect 无法推断
compose 逻辑 已丢失
depends_on 容器级别无概念