ฉันจะแสดงรายการแท็กทั้งหมดของอิมเมจ Docker ในรีโมตรีจิสทรี Docker โดยใช้ CLI (ที่ต้องการ) หรือ curl ได้อย่างไร
โดยไม่ต้องดึงทุกรุ่นจากรีโมตรีโมต ฉันต้องการแสดงรายการแท็ก
docker(1)
github.com/docker/for-linux/issues/455
ฉันจะแสดงรายการแท็กทั้งหมดของอิมเมจ Docker ในรีโมตรีจิสทรี Docker โดยใช้ CLI (ที่ต้องการ) หรือ curl ได้อย่างไร
โดยไม่ต้องดึงทุกรุ่นจากรีโมตรีโมต ฉันต้องการแสดงรายการแท็ก
docker(1)
github.com/docker/for-linux/issues/455
คำตอบ:
ผมได้คำตอบจากที่นี่ ขอบคุณมาก! :)
เพียงหนึ่งบรรทัดสคริปต์: (ค้นหาแท็กทั้งหมดของเดเบียน)
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'
...
[backtick] เพื่อรวมมันเป็นหนึ่งบรรทัด และ / หรือแทนที่ "debian" ด้วย $ 1 และใส่ไว้ในสคริปต์ที่เรียกว่า "dockertags" ภายใต้ / usr / local / bin จากนั้นก่อนปิด backtick คุณสามารถเพิ่ม | grep $ 2 จากนั้น chmod + x it จากนั้นคุณสามารถไปที่ "dockertags php apache" เพื่อดูแท็ก php ทั้งหมดที่มี apache
wget -q https://registry.hub.docker.com/v1/repositories/circleci/ruby/tags -O - | jq -r '.[].name'
หากคุณjq
ติดตั้งแล้ว
sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g'
มีการเขียนเพิ่มเติมหมดจดtr -d '[]" '
userauth="-u ${2}"
เพื่ออนุญาตให้ฉัน${userauth}
(ถ้าว่างเปล่าไม่มีการสลับหรือ params) สิ่งนี้อาจช่วยให้ทุกคนที่ใช้ repo ส่วนตัว
sed
ดูเหมือนจะใช้งานได้ง่ายกว่าสำหรับการตรวจสอบอย่างรวดเร็ว ...
หากคุณต้องการใช้ 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"]'
https://registry.hub.docker.com/v2/repositories/library/centos/tags/?page=101
ทำงานหรือไม่?
java
ภาพเป็นตัวอย่างที่ดี ใช่คุณสามารถทำสิ่งต่างๆเช่นregistry.hub.docker.com/v2/repositories/library/java/tags/... ดูตัวอย่างnext
และprevious
ลิงก์ในผลลัพธ์
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 จากการตอบกลับที่ไม่ได้รับการรับรองความถูกต้อง
arr=("$@")
ไม่จำเป็นต้องเป็น เพิ่งเขียนdocker-tags() { for item; do ....
ฉันจัดการเพื่อให้มันทำงานโดยใช้ curl:
curl -u <username>:<password> https://tutum.co/v1/repositories/<username>/<image_name>/tags
โปรดทราบว่าimage_name
ไม่ควรมีรายละเอียดของผู้ใช้ ฯลฯ ตัวอย่างเช่นถ้าคุณกำลังผลักดันภาพชื่อtutum.co/username/x
แล้วควรจะเป็นimage_name
x
อาคารในคำตอบยันภาพถ่าย (คน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"
]
}
หากเครื่องมือการวิเคราะห์ JSON jq
พร้อมใช้งาน
wget -q https://registry.hub.docker.com/v1/repositories/debian/tags -O - | \
jq -r '.[].name'
'.[].name'
no matches found: .[].name
. แต่มันใช้งานได้ดีกับการทุบตีบางทีมันอาจเป็นเปลือกเริ่มต้นของคุณ?
jq
คำสั่งแล้ว
ดูอรรถประโยชน์ของ 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
วิธีดูแท็กทั้งหมดที่มีในเบราว์เซอร์:
https://registry.hub.docker.com/v1/repositories/<username>/<image_name>/tags
ie https://hub.docker.com/r/localstack/localstack/tags
หรือคุณสามารถรับคำตอบ json โดยใช้จุดปลายนี้:
https://registry.hub.docker.com/v1/repositories/localstack/localstack/tags
คุณยังสามารถใช้เรื่องที่สนใจนี้ได้:
# 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
[หวังว่าคุณจะทราบ$ & #ก่อนเรียกใช้คำสั่งใด ๆ ]
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', =)
รับแท็กทั้งหมดจาก 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"]'
นี่คือสคริปต์ 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
}
คุณสามารถบรรลุผลได้ด้วยการรันบนเทอร์มินัล:
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
curl -L -s 'https://registry.hub.docker.com/v1/repositories/danilobatistaqueiroz/job-wq-1/tags'
ฉันได้ทำสิ่งนี้เมื่อฉันต้องใช้งานซึ่งถ้าผู้ใช้พิมพ์แท็กที่ไม่ถูกต้องแล้วเราจะต้องให้รายการของแท็กทั้งหมดที่มีอยู่ใน 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
หาง Registry API มีปลายทางที่จะแสดงรายการแท็กทั้งหมด
ดูเหมือน Tutum มีปลายทางที่คล้ายกันเช่นเดียวกับวิธีที่จะเข้าถึงผ่านทางtutum-CLI
ด้วย tutum-cli ลองทำสิ่งต่อไปนี้:
tutum tag list <uuid>
ใน 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" }
คุณสามารถแสดงรายการแท็กทั้งหมดที่มี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>
หากผู้ใช้ต้องการอ่านแท็กจากรีจีสตรี 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 ต้นน้ำแล้วที่นี่เป็นสคริปต์ที่สมบูรณ์