Làm cách nào tôi có thể liệt kê tất cả các thẻ cho hình ảnh Docker trên sổ đăng ký từ xa?


205

Làm cách nào tôi có thể liệt kê tất cả các thẻ của hình ảnh Docker trên sổ đăng ký Docker từ xa bằng cách sử dụng CLI (ưu tiên) hoặc cuộn tròn?

Tốt nhất là không kéo tất cả các phiên bản từ đăng ký từ xa. Tôi chỉ muốn liệt kê các thẻ.



1
Tôi đã mở một vé yêu cầu tính năng này trong docker(1) github.com/docker/for-linux/issues/455
Winny

Câu trả lời:


177

Tôi đã nhận được câu trả lời từ đây . Cảm ơn rất nhiều! :)

Chỉ một tập lệnh: (tìm tất cả các thẻ của debian)

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'

CẬP NHẬT Cảm ơn lời khuyên của @ degelf. Đây là kịch bản shell.

#!/bin/bash

if [ $# -lt 1 ]
then
cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE: 
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/${image}/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]
then
    tags=` echo "${tags}" | grep "$2" `
fi

echo "${tags}"

Bạn chỉ có thể tạo một tên tệp mới dockertags, bên dưới / usr / local / bin (hoặc thêm một env PATH vào .bashrc/ .zshrc) của bạn và đặt mã đó vào đó. Sau đó thêm các quyền thực thi ( chmod +x dockertags).

Sử dụng:

dockertags ubuntu ---> liệt kê tất cả các thẻ của Ubuntu

dockertags php apache ---> liệt kê tất cả các thẻ php php chứa 'apache'


1
Bạn có thể gói toàn bộ trong echo [backtick] ...[backtick] để ngưng tụ nó thành một dòng. Và / hoặc thay thế "debian" bằng $ 1 và đặt nó vào tập lệnh có tên "dockertags" bên dưới / usr / local / bin. Sau đó, trước khi đóng backtick, bạn có thể thêm | grep $ 2. Sau đó chmod + x nó, và sau đó bạn có thể vào "dockertags php apache" để xem tất cả các thẻ php có chứa apache.
dagelf

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'nếu bạn đã jqcài đặt
Tanner

1

1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'được viết sạch sẽ hơn nhiềutr -d '[]" '
William Pursell

1
Tôi đã sửa đổi để sử dụng đối số vị trí thứ hai làm tên người dùng: mật khẩu để tôi có thể tắt wget cho curl và sử dụng userauth="-u ${2}"cho phép tôi ${userauth}(nếu nó trống không có bạn chuyển đổi hoặc params). Điều này có thể giúp bất cứ ai sử dụng repo tư nhân
MrMesees 17/2/19

79

Kể từ Docker Registry V2, một điều kiện đơn giản GET:

GET /v2/<name>/tags/list

Xem tài liệu để biết thêm.


3
Dựa trên thông tin trong phần phụ Thẻ trong tài liệu , GET này dường như cần có sự cho phép, do đó, API v1 + seddường như thực sự đơn giản hơn để sử dụng để kiểm tra nhanh ...
akavel

3
Nếu bạn gặp lỗi "trái phép", hãy xem câu trả lời thay thế của tôi . Không xúc phạm đến người đăng câu trả lời ban đầu. Tôi đã phải thực hiện các bước bổ sung để có được câu trả lời ở trên để làm việc và muốn giúp đỡ người khác.
RobV8R

23

Nếu bạn muốn sử dụng API v2 đăng ký docker, nó liệt kê các thẻ theo trang. Để liệt kê tất cả các thẻ của một hình ảnh, bạn có thể muốn thêm một tham số page_size lớn vào url, ví dụ:

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/centos/tags?page_size=1024'|jq '."results"[]["name"]'

2
Docker Hub xuất hiện để giới hạn page_size ở mức tối đa hiệu quả là 100.
Shane

2
@Shane ơi sao? Tôi đã không bắt gặp một hình ảnh với nhiều trang. Có một url như https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101công việc?
0xCC

2
các javahình ảnh là một ví dụ điển hình. Có, bạn có thể thực hiện những việc như registry.hub.docker.com/v2/repos khu / l Library / java / tags / . Xem nextpreviousliên kết trong kết quả cho ví dụ.
Shane

19

API Docker V2 yêu cầu mã thông báo mang OAuth với các yêu cầu phù hợp. Theo tôi, tài liệu chính thức khá mơ hồ về chủ đề này. Để những người khác không trải qua nỗi đau giống như tôi đã làm, tôi cung cấp docker-tagschức năng dưới đây .

Phiên bản gần đây nhất docker-tagscó thể được tìm thấy trong GitHubGist của tôi : "Liệt kê các thẻ hình ảnh Docker bằng bash" .

Hàm docker-tags có phụ thuộc vào jq . Nếu bạn đang chơi với JSON, có khả năng bạn đã có nó.

#!/usr/bin/env bash
docker-tags() {
    arr=("$@")

    for item in "${arr[@]}";
    do
        tokenUri="https://auth.docker.io/token"
        data=("service=registry.docker.io" "scope=repository:$item:pull")
        token="$(curl --silent --get --data-urlencode ${data[0]} --data-urlencode ${data[1]} $tokenUri | jq --raw-output '.token')"
        listUri="https://registry-1.docker.io/v2/$item/tags/list"
        authz="Authorization: Bearer $token"
        result="$(curl --silent --get -H "Accept: application/json" -H "Authorization: Bearer $token" $listUri | jq --raw-output '.')"
        echo $result
    done
}

Thí dụ

docker-tags "microsoft/nanoserver" "microsoft/dotnet" "library/mongo" "library/redis"

Phải thừa nhận, docker-tagsđưa ra một số giả định. Cụ thể, các tham số yêu cầu OAuth chủ yếu được mã hóa cứng. Việc triển khai tham vọng hơn sẽ đưa ra yêu cầu không được xác thực đến cơ quan đăng ký và rút ra các tham số OAuth từ phản hồi không được xác thực.


3
Không cần arr=("$@"). Chỉ cần viếtdocker-tags() { for item; do ....
William Pursell

Cảm ơn vì điều này. Nhận được mã thông báo đó đã khiến tôi phát điên.
FelicianoTech

17

Tôi đã quản lý để làm cho nó hoạt động bằng cách sử dụng curl:

curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags

Lưu ý rằng image_namekhông nên chứa chi tiết người dùng, v.v. Ví dụ: nếu bạn đang đẩy hình ảnh có tên tutum.co/username/xthì image_namenên x.


1
Điểm cuối v2 được ghi lại ở đây: docs.docker.com/registry/spec/api/#listing-image-tags
morloch

1
Trang web tutum.co này là gì mà bạn nói tôi nên cung cấp cho họ thông tin đăng nhập và mật khẩu dockerhub của tôi?
Nakilon

1
@Nakilon Khi tôi viết câu trả lời này, vài năm trước, Tutum là một dịch vụ cung cấp Docker Registry riêng. Và tôi không "cho họ" mật khẩu của mình, tôi xác thực với dịch vụ của họ bằng xác thực cơ bản HTTP tiêu chuẩn qua https.
Johan

Tutum không còn tồn tại nữa. Bạn có thể cập nhật câu trả lời của mình để mọi người không vô tình gửi thông tin đăng nhập của họ cho bất kỳ ai sở hữu tên miền đó bây giờ không?
opyh


6

Nếu công cụ phân tích cú pháp JSON, jqcó sẵn

wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
    jq -r '.[].name'

1
Sử dụng dấu ngoặc kép để tránh vấn đề với jq:'.[].name'
Soullivaneuh

1
@Soullivaneuh những vấn đề có thể xảy ra mà không có dấu ngoặc kép? Cảm ơn!
sigjuice

Với zsh, tôi có lỗi sau : no matches found: .[].name. Nhưng nó hoạt động tốt trên bash, có lẽ đó là vỏ mặc định của bạn?
Soullivaneuh

@Soullivaneuh cảm ơn! Tôi đã thêm dấu ngoặc kép vào jqlệnh
sigjuice

4

Xem tiện ích CLI: https://www.npmjs.com/package/docker-browse

Cho phép liệt kê các thẻ và hình ảnh.

docker-browse tags <image>sẽ liệt kê tất cả các thẻ cho hình ảnh. ví dụdocker-browse tags library/alpine

docker-browse imagessẽ liệt kê tất cả các hình ảnh trong sổ đăng ký. Hiện tại không có sẵn cho index.docker.io.

Bạn có thể kết nối nó với bất kỳ sổ đăng ký nào, kể cả sổ đăng ký riêng tư của bạn, miễn là nó hỗ trợ Docker Registry HTTP API V2



2

Bạn cũng có thể sử dụng phế liệu này:

# vim /usr/sbin/docker-tags 

& Nối sau (như nó là):

#!/bin/bash
im="$1"
[[ -z "$im" ]] && { echo -e '\e[31m[-]\e[39m Where is the image name ??' ; exit ; }
[[ -z "$(echo "$im"| grep -o '/')" ]] && { link="https://hub.docker.com/r/library/$im/tags/" ; } || { link="https://hub.docker.com/r/$im/tags/" ; }
resp="$(curl -sL "$link")"
err="$(echo "$resp" | grep -o 'Page Not Found')"
if [[ ! -z "$err" ]] ; then
    echo -e "\e[31m[-]\e[39m No Image Found with name => [ \e[32m$im\e[39m ]"
    exit
else
    tags="$(echo "$resp"|sed  -e 's|}|\n|g' -e 's|{|\n|g'|grep '"result"'|sed -e 's|,|\n|g'|cut -d '[' -f2|cut -d ']' -f1|sed  '/"tags":/d'|sed -e 's|"||g')"
    echo -e "\e[32m$tags\e[39m"
fi

Làm cho nó thực thi:

# chmod 755 /usr/sbin/docker-tags

Cuối cùng, hãy thử bằng cách:

$ docker-tags testexampleidontexist
   [-] No Image Found with name => [ testexampleidontexist ]

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[Hy vọng bạn biết về $ & # trước khi chạy bất kỳ lệnh nào]


2
curl -u <username>:<password> https://$your_registry/v2/$image_name/tags/list -s -o - | \
    tr -d '{' | tr -d '}' | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | \
    awk -F: '{print $3}' | sed -e 's/,/\n/g'

Bạn có thể sử dụng nó nếu env của bạn không có 'jq', =)


2

Nhận tất cả các thẻ từ Docker Hub: lệnh này sử dụng JSONbộ xử lý dòng lệnh jqđể chọn tên thẻ từ thanh JSONghi Docker Hub trả về (dấu ngoặc kép được loại bỏ tr). Thay thế thư viện bằng tên người dùng Docker Hub, debian bằng tên hình ảnh:

curl -s 'https://registry.hub.docker.com/v2/repositories/library/debian/tags/' | jq -r '."results"[]["name"]'

2
Vui lòng xem xét thêm một lời giải thích nhỏ về lý do tại sao điều này trả lời câu hỏi, nó làm gì, ...
β.οιτ.

2

Đây là một kịch bản Powershell tôi đã viết cho Windows. Xử lý repos v1 và v2:

Get-DockerImageVersions.ps1:

param (
  [Parameter (Mandatory=$true)]$ImageName,
  [Parameter (Mandatory=$false)]$RegistryURL
)

if (!$RegistryURL) 
{
  $RegistryURL = "https://registry.hub.docker.com/v1/repositories"
}

$list = ""
if ($RegistryURL -like "*v2*") 
{
  $list = "/list"
}

$URL = "$RegistryURL/$ImageName/tags$list"

write-debug $URL
$resp = Invoke-WebRequest -UseBasicParsing $URL | ConvertFrom-Json

if ($RegistryURL -like "*v2*") 
{
  $tags = $resp | select tags
  $tags.tags
} else {
  $tags = $resp | select name
  $tags.name
}

2

Bạn có thể đạt được bằng cách chạy trên thiết bị đầu cuối này:

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq . | grep name

Ngoài ra, nếu bạn không có jq, bạn phải cài đặt nó bằng cách

sudo apt-get install jq

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name sẽ tiết kiệm cho bạn một lệnh grep
maton kepson

sử dụng phiên bản 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo

1

Tôi đã làm điều này khi tôi phải thực hiện một tác vụ trong đó nếu người dùng bằng cách nào đó gõ nhầm thẻ thì chúng tôi phải đưa ra danh sách tất cả các thẻ có trong repo (Docker repo) có trong sổ đăng ký. Vì vậy, tôi có mã trong đợt Script.

<html>
<pre style="background-color:#bcbbbb;">
@echo off

docker login --username=xxxx --password=xxxx
docker pull %1:%2

IF NOT %ERRORLEVEL%==0 (
echo "Specified Version is Not Found "
echo "Available Version for this image is :"
for /f %%i in (' curl -s -H "Content-Type:application/json" -X POST -d "{\"username\":\"user\",\"password\":\"password\"}" https://hub.docker.com/v2/users/login ^|jq -r .token ') do set TOKEN=%%i
curl -sH "Authorization: JWT %TOKEN%" "https://hub.docker.com/v2/repositories/%1/tags/" | jq .results[].name
)
</pre>
</html>

Vì vậy, trong phần này, chúng ta có thể đưa ra các đối số cho ra tệp bó như:

Dockerfile java phiên bản7 


1

API Docker Registry có một điểm cuối để liệt kê tất cả các thẻ .

Có vẻ như Tutum có một điểm cuối tương tự , cũng như một cách để truy cập thông qua tutum-cli .

Với tutum-cli, hãy thử như sau:

tutum tag list <uuid>

1
Tôi không nghĩ rằng điều này làm việc cho hình ảnh đăng ký. Tôi chỉ nhận được một "Mã định danh '<id>' không khớp với bất kỳ dịch vụ, nút hoặc nút bấm" nào.
Johan

1

Trong powershell 5.1, tôi có một tập lệnh list_docker_image_tags.ps1 đơn giản như thế này:

[CmdletBinding()]
param (
    [Parameter(Mandatory = $true)]
    [string]
    $image
)

$url = "https://registry.hub.docker.com/v1/repositories/{0}/tags" -f $image 
Invoke-WebRequest $url  | ConvertFrom-Json | Write-Output

Sau đó, tôi có thể grep cho 4,7 thẻ như thế này:

./list_docker_image_tags.ps1 microsoft/dotnet-framework | ?{ $_.name -match "4.7" }

1

Bạn có thể liệt kê tất cả các thẻ với skopeo .

அ  ~  skopeo inspect docker://httpd |jq .RepoTags
[
  "2-alpine",
  "2.2-alpine",
  "2.2.29",
  "2.2.31-alpine",
  "2.2.31",
  "2.2.32-alpine",
  "2.2.32",
  "2.2.34-alpine",
  "2.2.34",
  "2.2",
  "2.4-alpine",
  "2.4.10",
  "2.4.12",
  "2.4.16",
  "2.4.17",
  "2.4.18",
  "2.4.20",
  "2.4.23-alpine",
  "2.4.23",
  "2.4.25-alpine",
  "2.4.25",
  "2.4.27-alpine",
  "2.4.27",
  "2.4.28-alpine",
  "2.4.28",
  "2.4.29-alpine",
  "2.4.29",
  "2.4.32-alpine",
  "2.4.32",
  "2.4.33-alpine",
  "2.4.33",
  "2.4.34-alpine",
  "2.4.34",
  "2.4.35-alpine",
  "2.4.35",
  "2.4.37-alpine",
  "2.4.37",
  "2.4.38-alpine",
  "2.4.38",
  "2.4.39-alpine",
  "2.4.39",
  "2.4.41-alpine",
  "2.4.41",
  "2.4.43-alpine",
  "2.4.43",
  "2.4",
  "2",
  "alpine",
  "latest"
]

Đối với đăng ký bên ngoài:

அ  ~  skopeo inspect --creds username:password docker://<registry-url>/<repo>/<image>

0

Nếu mọi người muốn đọc các thẻ từ sổ đăng ký RedHat https://registry.redhat.io/v2thì các bước là:

# example nodejs-12 image
IMAGE_STREAM=nodejs-12
REDHAT_REGISTRY_API="https://registry.redhat.io/v2/rhel8/$IMAGE_STREAM"
# Get an oAuth token based on a service account username and password https://access.redhat.com/articles/3560571
TOKEN=$(curl --silent -u "$REGISTRY_USER":"$REGISTRY_PASSWORD" "https://sso.redhat.com/auth/realms/rhcc/protocol/redhat-docker-v2/auth?service=docker-registry&client_id=curl&scope=repository:rhel:pull" |  jq --raw-output '.token')
# Grab the tags
wget -q --header="Accept: application/json" --header="Authorization: Bearer $TOKEN" -O - "$REDHAT_REGISTRY_API/tags/list" | jq -r '."tags"[]' 

Nếu bạn muốn so sánh những gì bạn có trong sổ đăng ký openshift cục bộ của bạn với những gì trong registry.redhat.com ngược dòng thì đây là một tập lệnh hoàn chỉnh .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.