从已运行容器获取docker run参数

从已运行容器获取docker run参数

最近遇到一个问题,有一个容器运行了很久,由于时间太久远,已经忘记当初的启动参数,也并没有使用 docker-compose k8s 这样的编排工具。

现在我想新建一个和它一样的容器,或者重启容器,如何找回之前使用的完整 docker run 参数呢?

查看在运行容器隐藏参数

我们知道使用 docker ps 可以查看运行的容器信息,其中有一个参数 --no-trunc 可以显示隐藏部分的信息。

这个参数的主要作用就是不要截断输出内容。但是很遗憾,虽然显示的内容多了,然而没有我们需要的run参数。

$ docker ps --no-trunc
CONTAINER ID  IMAGE     COMMAND                     CREATED         STATUS          PORTS       NAMES
b677ba6       nginx     "/sbin/tini -- run.sh"      1 month ago     Up 1 month      443/tcp     nginx1

docker inspect

为了找回启动参数我们尝试使用 docker inspect , 这个显示的信息比较全,是一个json格式,内容很多,我们需要挑选参数,自己组装,但是其结果也并不明显。

$ docker inspect -f "{{.Name}} {{.Path}} {{.Args}} {{.Config.Cmd}}" nginx1
/nginx /sbin/tini [-- run.sh] [/sbin/tini -- run.sh]

runlike

经过一番搜索后,发现一个神奇的工具 runlike , 这个工具就是专门干这个事情的。

See this docker container? I wish I could run another one just like it, but I'll be damned if I'm going to type all those command-line switches manually!

容器化安装

runlike提供了一个封装好的容器镜像 assaflavie/runlike.

首先我们拉取镜像

docker pull assaflavie/runlike

它的用法很简单

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike YOUR-CONTAINER

可以通过增加 -p 参数,让显示结果自动换行,下面是我的真实测试:

$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike -p nginx
docker run \
 --name=nginx \
 --hostname=f29562eb37f9 \
 --mac-address=02:42:ac:11:00:03 \
 --env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
 --env=UID=991 \
 --env=GID=991 \
 --volume=/data/nginx/log:/var/log/nginx \
 --volume=/data/nginx/certs:/certs \
 --volume=/data/nginx/main:/main \
 --volume=/data/nginx/sites-enabled:/sites-enabled \
 --volume=/data/nginx/conf:/conf.d \
 --volume=/certs \
 --volume=/conf.d \
 --volume=/passwds \
 --volume=/sites-enabled \
 --volume=/var/log/nginx \
 --volume=/www \
 --expose=2200 \
 -p 443:4430 \
 -p 80:8000 \
 --restart=always \
 --label='description=nginx built from source.' \
 --label='nginx=nginx 1.11.3.' \
 --label='openssl=LibreSSL 2.4.2.' \