2014-06-25 28 views
10

Tôi cần sử dụng các lệnh CLI nào để kiểm tra xem hình ảnh trong private docker registry của tôi có phải là phiên bản mới hơn phiên bản hiện đang chạy trên máy chủ của tôi không?Docker - kiểm tra phiên bản hình ảnh đăng ký riêng

Ví dụ: Tôi có một vùng chứa mà tôi đã chạy bằng cách sử dụng docker run -d my.domain.com:5000/project1

và tôi muốn biết liệu nó có lỗi thời không.

Trả lời

10

Điểm Brownie đến @mbarthelemy và @amuino, người đã giúp tôi đi đúng hướng. Từ đó tôi đã có thể đưa ra kịch bản bash sau mà người khác có thể thấy hữu ích. Nó chỉ kiểm tra xem thẻ trên sổ đăng ký có khác với vùng chứa hiện đang thực thi hay không.

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

Tôi không biết điều này có hoạt động như được quảng cáo hay không. Chỉ cần một hack nhanh tôi chỉ cần đặt lại với nhau. Nhưng điều này sẽ ít nhất là cung cấp cho bạn một chút đẩy về cách này có thể được thực hiện.

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

Ví dụ đầu ra:

[[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

Tôi đoán điều này sẽ hiệu quả nếu tôi đang tạo hình ảnh trên cùng một máy chủ đang được triển khai d trên, nhưng tôi không, do đó việc sử dụng registry cá nhân. Tôi không thể tìm thấy bất kỳ lệnh nào để giao tiếp với đăng ký riêng tư để liệt kê hình ảnh/nhận thông tin, v.v. – Programster

+1

Thật không may (và tôi không thể tìm ra lý do đằng sau điều đó) có rất ít tương tác với sổ đăng ký từ 'docker' CLI . 'docker search' (làm việc với Index/Hub, không phải là registry),' docker pull', 'docker tag',' docker push' và đó là khá nhiều. Tôi thực sự thích có các lệnh bổ sung như 'docker lr' (liệt kê repos của bạn) và' docker check-updates/repo' (so sánh hình ảnh cục bộ với phiên bản hình ảnh repo) – mbarthelemy

0

AFAIK, điều này là không thể ngay bây giờ.

Điều duy nhất tôi nhìn thấy sẽ được kéo registry để kiểm tra nếu có một phiên bản mới của hình ảnh của bạn (sau đó sẽ có một ID khác so với hình ảnh lưu trữ cục bộ của bạn):

docker pull your/image:tag 

Nhưng vâng, điều đó có nghĩa là tìm nạp các hình ảnh mới (nếu có).

Nếu bạn có một cái nhìn tại the registry API documentation, bạn sẽ thấy rằng nếu bạn không nhớ kịch bản một chút, bạn có thể nhận được thông tin này mà không thực sự tải xuống hình ảnh, bằng cách tìm nạp thẻ hình ảnh và kiểm tra xem ID đã trả lại cho thẻ khớp với ID của hình ảnh cục bộ bạn có với cùng một thẻ.

Điều đó đang được nói, có điều gì đó để "kiểm tra cập nhật" được tích hợp vào CL23 docker sẽ là một bổ sung tốt đẹp.

4

Ngay cả khi không có lệnh, bạn có thể sử dụng API để kiểm tra các thẻ trên sổ đăng ký và so sánh với những gì bạn đang chạy.

$ 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 

Bằng cách so sánh các id, bạn có thể biết rằng bạn không chạy phiên bản mới nhất.

0

Không chắc về version nhưng nếu bạn có nghĩa là tag của hình ảnh, nó có thể dễ dàng kiểm tra bằng các registry v2 api. Lưu ý rằng trong bối cảnh của hình ảnh docker thẻ không có gì để làm với phiên bản của phần mềm.

Sử dụng lệnh curl trong CLI

curl <docker_host_ip>:<docker_host_port>/v2/<repository_name>/tags/list 

Để có được một danh sách các kho đẩy vào registry tư nhân, sử dụng

curl <docker_host_ip>:<docker_host_port>/v2/_catalog 
0

Bạn có thể sử dụng một kịch bản bash chạy trong một nhiệm vụ cron dự kiến:

#!/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 
Các vấn đề liên quan