プライベートDockerレジストリ のイメージが現在サーバーで実行されているものよりも新しいバージョンであるかどうかを確認するには、どのCLIコマンドを使用する必要がありますか?
例えば。 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
コマンドがない場合でも、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 で簡単に確認できます。 Dockerイメージのコンテキストでは、タグはソフトウェアのバージョンとは関係がないことに注意してください。
CLIでcurlコマンドを使用する
curl <docker_Host_ip>:<docker_Host_port>/v2/<repository_name>/tags/list
プライベートレジストリにプッシュされたリポジトリのリストを取得するには、
curl <docker_Host_ip>:<docker_Host_port>/v2/_catalog
これが宣伝どおりに機能するかどうかはわかりません。私がまとめたちょっとしたハック。しかし、これは少なくともこれがどのように行われるかについて少しプッシュするでしょう。
#!/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
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
AFAIK、これは現在不可能です。
私が見る唯一のことは、レジストリをプルして、イメージの新しいバージョンがあるかどうかを確認することです(ローカルに保存されているイメージとは異なるIDを持ちます)。
docker pull your/image:tag
しかし、はい、それは新しい画像(もしあれば)をフェッチすることを意味します。
レジストリAPIドキュメント を見ると、少しスクリプトを作成してもかまわない場合は、画像タグを取得して実際に画像をダウンロードしなくても、この情報を取得できることがわかります。返されたタグのIDが、同じタグを持つローカルイメージのIDと一致するかどうかを確認します。
そうは言っても、「更新をチェックする」何かをdocker
CLIに統合することは素晴らしい追加です。
古い質問ですが、これは Watchtower で解決できる問題のように聞こえます。これは、他のコンテナーに隣接して実行され、ベースイメージが更新されているかどうかを定期的に確認するDocker化された別のアプリケーションです。存在する場合、新しいイメージをダウンロードして再起動します。
正しい資格情報が与えられれば、ローカルレジストリで機能します。