2014-06-25 99 views

回答

10

布朗尼指出@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 
0

我不知道這是否如廣告所述。我只是把它放在一起而已。 但是這至少會給你一點點推動這可能是如何完成的。

#!/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 
+0

我猜這會工作,如果我正在部署在同一臺服務器上構建圖像ð,但我不是,因此使用私人註冊表。我似乎無法找到任何與私人註冊表連接的命令來列出圖像/獲取信息等。 – Programster

+1

不幸的是(我無法弄清楚背後的原因),docker CLI與註冊表的交互很少。 「碼頭搜索」(與索引/集線器,而不是註冊表一起使用),「碼頭拉」,「碼頭標籤」,「碼頭推」,這幾乎都是。我真的很想擁有額外的命令,比如'docker lr'(列出你的倉庫),'docker check-updates/repo'(比較本地映像和repo映像版本) – mbarthelemy

0

AFAIK,這現在是不可能的。

我看到是拉註冊表,以檢查是否有你的形象的一個新版本的唯一的事(隨後將有一個不同的ID不是你的本地存儲的圖像):

docker pull your/image:tag 

但是,是的,這意味着要獲取新圖像(如果有的話)。

如果你看看the registry API documentation,你會發現,如果你不介意腳本編寫,你可以在不實際下載圖片的情況下獲取這些信息,通過獲取圖片標籤並檢查返回的ID是否爲該標籤與具有相同標籤的本地圖像的ID相匹配。這就是說,有一些「檢查更新」集成到CLI將是一個不錯的補充。

4

即使沒有命令,您也可以使用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,你可以知道你沒有運行最新版本。

0

不知道的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 
0

可以使用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 
相關問題