從已執行容器獲取 docker run 引數

reggie發表於2022-03-18

最近遇到一個問題,有一個容器執行了很久,由於時間太久遠,已經忘記當初的啟動引數,也並沒有使用 docker-composek8s 這樣的編排工具。

現在我想新建一個和它一樣的容器,或者重啟容器,如何找回之前使用的完整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.'
--runtime=runc
--detach=true
nginx
/sbin/tini -- run.sh

如果想更方便的話可以使用別名執行它,例如,將其儲存在 ~/.profile 或者 ~/.bashrc 檔案中,如下:

alias runlike="docker run --rm -v /var/run/docker.sock:/var/run/docker.sock assaflavie/runlike"

然後就可以像本地命令一樣使用啦,使用 runlike YOUR-CONTAINER

最後

如果想避免忘記引數的情況,還是使用容器編排工具吧,方便快捷,永不忘記。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
微信公眾號:碼咚沒 ( ID: codingdongmei )

相關文章