ฉันจะแสดงรายการแท็กทั้งหมดสำหรับภาพ Docker ในรีจิสตรีระยะไกลได้อย่างไร


206

ฉันจะแสดงรายการแท็กทั้งหมดของอิมเมจ Docker ในรีโมตรีจิสทรี Docker โดยใช้ CLI (ที่ต้องการ) หรือ curl ได้อย่างไร

โดยไม่ต้องดึงทุกรุ่นจากรีโมตรีโมต ฉันต้องการแสดงรายการแท็ก



1
ฉันเปิดตั๋วเพื่อขอคุณลักษณะนี้ในdocker(1) github.com/docker/for-linux/issues/455
Winny

คำตอบ:


177

ผมได้คำตอบจากที่นี่ ขอบคุณมาก! :)

เพียงหนึ่งบรรทัดสคริปต์: (ค้นหาแท็กทั้งหมดของเดเบียน)

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}'

อัปเดตขอบคุณสำหรับคำแนะนำของ @ degelf นี่คือเชลล์สคริปต์

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

คุณสามารถสร้างชื่อไฟล์ใหม่dockertagsภายใต้ / usr / local / bin (หรือเพิ่ม PATH env ให้กับ.bashrc/ ของคุณ.zshrc) และใส่รหัสนั้นลงไป จากนั้นเพิ่มสิทธิ์อนุญาตปฏิบัติการ ( chmod +x dockertags)

การใช้งาน:

dockertags ubuntu ---> แสดงรายการแท็กทั้งหมดของ Ubuntu

dockertags php apache ---> แสดงรายการแท็ก php ทั้งหมดที่ประกอบด้วย 'apache'


1
คุณสามารถพันสิ่งทั้งหมดใน echo [backtick] ...[backtick] เพื่อรวมมันเป็นหนึ่งบรรทัด และ / หรือแทนที่ "debian" ด้วย $ 1 และใส่ไว้ในสคริปต์ที่เรียกว่า "dockertags" ภายใต้ / usr / local / bin จากนั้นก่อนปิด backtick คุณสามารถเพิ่ม | grep $ 2 จากนั้น chmod + x it จากนั้นคุณสามารถไปที่ "dockertags php apache" เพื่อดูแท็ก php ทั้งหมดที่มี apache
ร่างของ

8
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'หากคุณjqติดตั้งแล้ว
Tanner


1
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'มีการเขียนเพิ่มเติมหมดจดtr -d '[]" '
William Pursell

1
ฉันปรับเปลี่ยนเพื่อใช้อาร์กิวเมนต์ตำแหน่งที่สองเป็นชื่อผู้ใช้: รหัสผ่านเพื่อให้ฉันสามารถเปลี่ยน wget สำหรับ curl และใช้userauth="-u ${2}"เพื่ออนุญาตให้ฉัน${userauth}(ถ้าว่างเปล่าไม่มีการสลับหรือ params) สิ่งนี้อาจช่วยให้ทุกคนที่ใช้ repo ส่วนตัว
MrMesees

79

ในฐานะของ Docker Registry V2 ความGETพอเพียง:

GET /v2/<name>/tags/list

ดูเอกสารเพิ่มเติม


3
จากข้อมูลในส่วนย่อย Tags ในเอกสาร GET นี้ดูเหมือนว่าจะต้องได้รับอนุญาตดังนั้น v1 API + sedดูเหมือนจะใช้งานได้ง่ายกว่าสำหรับการตรวจสอบอย่างรวดเร็ว ...
akavel

3
หากคุณได้รับข้อผิดพลาด "ไม่ได้รับอนุญาต" ดูคำตอบอื่นของฉัน ไม่มีความผิดต่อผู้ที่โพสต์คำตอบดั้งเดิม ฉันต้องทำตามขั้นตอนเพิ่มเติมเพื่อให้ได้คำตอบข้างต้นเพื่อทำงานและต้องการช่วยเหลือผู้อื่น
RobV8R

23

หากคุณต้องการใช้ docker registry v2 API จะแสดงรายการแท็กตามหน้าเว็บ หากต้องการแสดงแท็กทั้งหมดของรูปภาพคุณอาจต้องการเพิ่มพารามิเตอร์ page_size ขนาดใหญ่ใน url เช่น

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

2
ดูเหมือนว่า Docker Hub จะ จำกัด page_size ให้มีประสิทธิภาพสูงสุด 100
Shane

2
@ เชนโอ้จริงเหรอ? ฉันไม่พบภาพที่มีหลายหน้า URL ชอบhttps://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101ทำงานหรือไม่?
0xCC

2
javaภาพเป็นตัวอย่างที่ดี ใช่คุณสามารถทำสิ่งต่างๆเช่นregistry.hub.docker.com/v2/repositories/library/java/tags/... ดูตัวอย่างnextและpreviousลิงก์ในผลลัพธ์
เชน

19

API ของ Docker V2 ต้องใช้โทเค็นผู้ถือ OAuth พร้อมการอ้างสิทธิ์ที่เหมาะสม ในความคิดของฉันเอกสารทางการค่อนข้างคลุมเครือในหัวข้อ เพื่อให้คนอื่นไม่ผ่านความเจ็บปวดแบบเดียวกับที่ฉันทำฉันเสนอdocker-tagsฟังก์ชั่นด้านล่าง

รุ่นล่าสุดของdocker-tagsสามารถพบได้ในของฉันGitHubGist: รายการ "หางแท็กรูปภาพใช้ทุบตี"

ฟังก์ชั่นนักเทียบท่าแท็กมีการพึ่งพาJQ หากคุณกำลังเล่นกับ JSON คุณน่าจะมีอยู่แล้ว

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

ตัวอย่าง

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

เป็นที่ยอมรับdocker-tagsทำให้มีหลายสมมติฐาน โดยเฉพาะอย่างยิ่งพารามิเตอร์คำขอ OAuth ส่วนใหญ่เป็นรหัสยาก การใช้งานที่มีความทะเยอทะยานมากขึ้นจะทำให้การร้องขอที่ไม่ได้รับการรับรองไปยังรีจิสทรีและรับพารามิเตอร์ OAuth จากการตอบกลับที่ไม่ได้รับการรับรองความถูกต้อง


3
arr=("$@")ไม่จำเป็นต้องเป็น เพิ่งเขียนdocker-tags() { for item; do ....
William Pursell

ขอบคุณสำหรับสิ่งนี้. การได้รับโทเค่นนั้นทำให้ฉันรู้สึกแย่
FelicianoTech

17

ฉันจัดการเพื่อให้มันทำงานโดยใช้ curl:

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

โปรดทราบว่าimage_nameไม่ควรมีรายละเอียดของผู้ใช้ ฯลฯ ตัวอย่างเช่นถ้าคุณกำลังผลักดันภาพชื่อtutum.co/username/xแล้วควรจะเป็นimage_namex


1
จุดสิ้นสุด v2 มีการบันทึกไว้ที่นี่: docs.docker.com/registry/spec/api/#listing-image-tags
morloch

1
เว็บไซต์ tutum.co นี้คืออะไรที่คุณบอกว่าฉันควรให้พวกเขาเข้าสู่ระบบและรหัสผ่านนักเทียบท่าของฉัน?
Nakilon

1
@Nakilon เมื่อฉันเขียนคำตอบนี้เมื่อหลายปีก่อน Tutum เป็นบริการที่ให้บริการ Docker Registry ส่วนตัว และฉันไม่ได้ "ให้พวกเขา" รหัสผ่านของฉันฉันจะตรวจสอบกับบริการของพวกเขาโดยใช้การตรวจสอบขั้นพื้นฐาน HTTP มาตรฐานผ่าน https
Johan

Tutum ไม่มีอยู่อีกต่อไป คุณสามารถอัปเดตคำตอบของคุณเพื่อที่คนไม่ได้ส่งข้อมูลประจำตัวของพวกเขาไปยังใครก็ตามที่เป็นเจ้าของโดเมนในขณะนี้?
opyh

6

อาคารในคำตอบยันภาพถ่าย (คนAPI v2 ) ผมสร้างง่ายหลามสคริปต์รายการแท็กภาพที่กำหนด

การใช้งาน:

./docker-registry-list.py alpine

เอาท์พุท:

{
  "name": "library/alpine",
  "tags": [
    "2.6",
    "2.7",
    "3.1",
    "3.2",
    "3.3",
    "3.4",
    "3.5",
    "3.6",
    "3.7",
    "edge",
    "latest"
  ]
}

6

หากเครื่องมือการวิเคราะห์ JSON jqพร้อมใช้งาน

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

1
ใช้เครื่องหมายคำพูดเพื่อหลีกเลี่ยงปัญหากับ'.[].name'
jq

1
@Soullivaneuh ปัญหาอะไรที่อาจเกิดขึ้นหากไม่มีเครื่องหมายอัญประกาศ ขอบคุณ!
sigjuice

ด้วย zsh ฉันมีข้อผิดพลาดดังต่อไปนี้: no matches found: .[].name. แต่มันใช้งานได้ดีกับการทุบตีบางทีมันอาจเป็นเปลือกเริ่มต้นของคุณ?
Soullivaneuh

@Soullivaneuh ขอบคุณ! ฉันได้เพิ่มเครื่องหมายคำพูดลงในjqคำสั่งแล้ว
sigjuice

4

ดูอรรถประโยชน์ของ CLI: https://www.npmjs.com/package/docker-browse

อนุญาตให้แจงนับแท็กและรูปภาพ

docker-browse tags <image>จะแสดงรายการแท็กทั้งหมดสำหรับภาพ เช่นdocker-browse tags library/alpine

docker-browse imagesจะแสดงรายการรูปภาพทั้งหมดในรีจิสทรี index.docker.ioไม่สามารถใช้ได้ในขณะนี้สำหรับ

คุณสามารถเชื่อมต่อกับรีจิสตรีใด ๆ รวมถึงส่วนตัวของคุณตราบใดที่มันรองรับ Docker Registry HTTP API V2



2

คุณยังสามารถใช้เรื่องที่สนใจนี้ได้:

# vim /usr/sbin/docker-tags 

& ผนวกการติดตาม (ตามเดิม):

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

ทำให้ปฏิบัติได้:

# chmod 755 /usr/sbin/docker-tags

จากนั้นลองโดย:

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

$ docker search ubuntu

$ docker-tags teamrock/ubuntu
   latest

[หวังว่าคุณจะทราบ$ & #ก่อนเรียกใช้คำสั่งใด ๆ ]


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'

คุณสามารถใช้มันได้หาก env ของคุณไม่มี 'jq', =)


2

รับแท็กทั้งหมดจาก Docker Hub: คำสั่งนี้ใช้JSONตัวประมวลผลบรรทัดคำสั่งjqเพื่อเลือกชื่อแท็กจากการJSONส่งคืนโดย Docker Hub Registry (เครื่องหมายคำพูดจะถูกลบออกด้วยtr) แทนที่ไลบรารีด้วยชื่อผู้ใช้ Docker Hub, debianด้วยชื่อรูปภาพ:

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

2
โปรดพิจารณาการเพิ่มคำอธิบายเล็ก ๆ ว่าทำไมคำถามนี้ตอบคำถามมันทำอะไร, ...
β.εηοιτ.βε

2

นี่คือสคริปต์ Powershell ที่ฉันเขียนสำหรับ Windows จัดการ repos v1 และ 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

คุณสามารถบรรลุผลได้ด้วยการรันบนเทอร์มินัล:

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

นอกจากนี้หากคุณไม่มี jq คุณต้องติดตั้งโดย

sudo apt-get install jq

curl -L -s 'https://registry.hub.docker.com/v2/repositories/library/mysql/tags/' | jq .results[].name จะช่วยให้คุณประหยัดคำสั่ง grep
26419 maton

ใช้รุ่น 1:curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
danilo

1

ฉันได้ทำสิ่งนี้เมื่อฉันต้องใช้งานซึ่งถ้าผู้ใช้พิมพ์แท็กที่ไม่ถูกต้องแล้วเราจะต้องให้รายการของแท็กทั้งหมดที่มีอยู่ใน repo (Docker repo) อยู่ในการลงทะเบียน ดังนั้นฉันมีรหัสในชุดสคริปต์

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

ดังนั้นในนี้เราสามารถให้อาร์กิวเมนต์กับไฟล์แบทช์เช่น:

Dockerfile java version7 


1

หาง Registry API มีปลายทางที่จะแสดงรายการแท็กทั้งหมด

ดูเหมือน Tutum มีปลายทางที่คล้ายกันเช่นเดียวกับวิธีที่จะเข้าถึงผ่านทางtutum-CLI

ด้วย tutum-cli ลองทำสิ่งต่อไปนี้:

tutum tag list <uuid>

1
ฉันไม่คิดว่ามันจะทำงานกับภาพรีจิสตรี ฉันเพิ่งได้รับ "ตัวระบุ '<id>' ไม่ตรงกับบริการโหนดหรือ nodecluster"
Johan

1

ใน powershell 5.1 ฉันมีสคริปต์list_docker_image_tags.ps1อย่างง่ายเช่นนี้:

[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

จากนั้นฉันสามารถ grep สำหรับแท็ก 4.7 เช่นนี้:

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

1

คุณสามารถแสดงรายการแท็กทั้งหมดที่มี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"
]

สำหรับการลงทะเบียนภายนอก:

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

0

หากผู้ใช้ต้องการอ่านแท็กจากรีจีสตรี RedHat ในhttps://registry.redhat.io/v2ขั้นตอนต่อไปนี้:

# 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"[]' 

หากคุณต้องการที่จะเปรียบเทียบสิ่งที่คุณมีในรีจิสทรี OpenShift ท้องถิ่นของคุณกับสิ่งที่อยู่ใน registry.redhat.com ต้นน้ำแล้วที่นี่เป็นสคริปต์ที่สมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.