我需要使用哪些CLI命令來檢查我的private docker registry中的映像是否比當前在我的服務器上運行的版本更新?Docker - 檢查私人註冊表映像版本
E.g.我有一個容器,我跑docker run -d my.domain.com:5000/project1
我想知道它是否過時。
我需要使用哪些CLI命令來檢查我的private docker registry中的映像是否比當前在我的服務器上運行的版本更新?Docker - 檢查私人註冊表映像版本
E.g.我有一個容器,我跑docker run -d my.domain.com:5000/project1
我想知道它是否過時。
布朗尼指出@mbarthelemy和@amuino讓我走上正軌。從中我可以想出下面的bash腳本,其他人可能會覺得有用。它只是檢查註冊表上的標籤是否與當前正在執行的容器不同。
#!/bin/bash
# ensure running bash
if ! [ -n "$BASH_VERSION" ];then
echo "this is not bash, calling self with bash....";
SCRIPT=$(readlink -f "$0")
/bin/bash $SCRIPT
exit;
fi
REGISTRY="my.registry.com:5000"
REPOSITORY="awesome-project-of-awesomeness"
LATEST="`wget -qO- http://$REGISTRY/v1/repositories/$REPOSITORY/tags`"
LATEST=`echo $LATEST | sed "s/{//g" | sed "s/}//g" | sed "s/\"//g" | cut -d ' ' -f2`
RUNNING=`docker inspect "$REGISTRY/$REPOSITORY" | grep Id | sed "s/\"//g" | sed "s/,//g" | tr -s ' ' | cut -d ' ' -f3`
if [ "$RUNNING" == "$LATEST" ];then
echo "same, do nothing"
else
echo "update!"
echo "$RUNNING != $LATEST"
fi
我不知道這是否如廣告所述。我只是把它放在一起而已。 但是這至少會給你一點點推動這可能是如何完成的。
#!/bin/bash
container=$1
imageid=$(docker inspect --format '{{.Config.Image}}' ${container})
echo "Running version from: $(docker inspect --format '{{.Created}}' ${container})"
echo "Image version from: $(docker inspect --format '{{.Created}}' ${imageid})"
輸出示例:
[[email protected] ~]# sh version_check.sh 9e500019b9d4
Running version from: 2014-05-30T08:24:08.761178656Z
Image version from: 2014-05-01T16:48:24.163628504Z
AFAIK,這現在是不可能的。
我看到是拉註冊表,以檢查是否有你的形象的一個新版本的唯一的事(隨後將有一個不同的ID不是你的本地存儲的圖像):
docker pull your/image:tag
但是,是的,這意味着要獲取新圖像(如果有的話)。
如果你看看the registry API documentation,你會發現,如果你不介意腳本編寫,你可以在不實際下載圖片的情況下獲取這些信息,通過獲取圖片標籤並檢查返回的ID是否爲該標籤與具有相同標籤的本地圖像的ID相匹配。這就是說,有一些「檢查更新」集成到CLI將是一個不錯的補充。
即使沒有命令,您也可以使用API檢查註冊表中的標記,並與您正在運行的內容進行比較。
$ curl --silent my.domain.com:5000/v1/repositories//project1/tags | grep latest
{"latest": "116f283e4f19716a07bbf48a562588d58ec107fe6e9af979a5b1ceac299c4370"}
$ docker images --no-trunc my.domain.com:5000/project1
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
my.domain.com:5000 latest 64d935ffade6ed1cca3de1b484549d4d278a5ca62b31165e36e72c3e6ab8a30f 4 days ago 583.2 MB
通過比較ID,你可以知道你沒有運行最新版本。
不知道的version
,但如果你的意思是圖像的tag
,它可以很容易地通過registry v2 api檢查。請注意,在碼頭圖像上下文中與軟件版本無關。
在CLI中使用curl命令
curl <docker_host_ip>:<docker_host_port>/v2/<repository_name>/tags/list
要獲取庫列表推私營註冊表,使用
curl <docker_host_ip>:<docker_host_port>/v2/_catalog
可以使用bash腳本在cron
計劃任務運行:
#!/bin/bash
docker_instance='YOUR_RUNNING_INSTANCE'
instance_id=$(docker ps -qa --filter name=$docker_instance)
image_name_tag=$(docker inspect $instance_id | jq -r [] |.Config.Image')
if [ "-${image_name_tag}-" != "--" ]; then
status=$(docker pull $image_name_tag | grep "Downloaded newer image")
if [ "-${status}-" != "--" ]; then
echo ">>> There is one update for this image ... "
# stop the docker instance
docker stop $docker_instance
# remove the docker instance
docker rm $docker_instance
# restart the docker using the last command, using the new image from the remote repository
run-my-docker-instance.sh
fi
fi
我猜這會工作,如果我正在部署在同一臺服務器上構建圖像ð,但我不是,因此使用私人註冊表。我似乎無法找到任何與私人註冊表連接的命令來列出圖像/獲取信息等。 – Programster
不幸的是(我無法弄清楚背後的原因),docker CLI與註冊表的交互很少。 「碼頭搜索」(與索引/集線器,而不是註冊表一起使用),「碼頭拉」,「碼頭標籤」,「碼頭推」,這幾乎都是。我真的很想擁有額外的命令,比如'docker lr'(列出你的倉庫),'docker check-updates/repo'(比較本地映像和repo映像版本) – mbarthelemy