web-dev-qa-db-ja.com

Docker-プライベートレジストリイメージのバージョンを確認します

プライベートDockerレジストリ のイメージが現在サーバーで実行されているものよりも新しいバージョンであるかどうかを確認するには、どのCLIコマンドを使用する必要がありますか?

例えば。 docker run -d my.domain.com:5000/project1を使用して実行したコンテナがあります

そして、それが古くなっているかどうか知りたいのですが。

11
Programster

ブラウニーは、私を軌道に乗せた@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
10
Programster

コマンドがない場合でも、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を比較することで、最新バージョンを実行していないことがわかります。

4
Abel Muiño

versionについてはわかりませんが、画像のtagを意味する場合は、 registry v2 api で簡単に確認できます。 Dockerイメージのコンテキストでは、タグはソフトウェアのバージョンとは関係がないことに注意してください。

CLIでcurlコマンドを使用する

 curl <docker_Host_ip>:<docker_Host_port>/v2/<repository_name>/tags/list

プライベートレジストリにプッシュされたリポジトリのリストを取得するには、

curl <docker_Host_ip>:<docker_Host_port>/v2/_catalog
1
Sameer Sinha

これが宣伝どおりに機能するかどうかはわかりません。私がまとめたちょっとしたハック。しかし、これは少なくともこれがどのように行われるかについて少しプッシュするでしょう。

#!/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})"

出力例:

[root@server ~]# sh version_check.sh 9e500019b9d4
Running version from: 2014-05-30T08:24:08.761178656Z
Image version from: 2014-05-01T16:48:24.163628504Z
0
xeor

cronスケジュールされたタスクで実行されているbashスクリプトを使用できます。

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

AFAIK、これは現在不可能です。

私が見る唯一のことは、レジストリをプルして、イメージの新しいバージョンがあるかどうかを確認することです(ローカルに保存されているイメージとは異なるIDを持ちます)。

docker pull your/image:tag

しかし、はい、それは新しい画像(もしあれば)をフェッチすることを意味します。

レジストリAPIドキュメント を見ると、少しスクリプトを作成してもかまわない場合は、画像タグを取得して実際に画像をダウンロードしなくても、この情報を取得できることがわかります。返されたタグのIDが、同じタグを持つローカルイメージのIDと一致するかどうかを確認します。

そうは言っても、「更新をチェックする」何かをdockerCLIに統合することは素晴らしい追加です。

0
mbarthelemy

古い質問ですが、これは Watchtower で解決できる問題のように聞こえます。これは、他のコンテナーに隣接して実行され、ベースイメージが更新されているかどうかを定期的に確認するDocker化された別のアプリケーションです。存在する場合、新しいイメージをダウンロードして再起動します。

正しい資格情報が与えられれば、ローカルレジストリで機能します。

0
robsiemb