Проверьте, существует ли комбинация изображений: тегов на докере-хабе
Как часть bash script, я хочу проверить, существует ли комбинация ярлыков: docker image на докер-хабе. Кроме того, это будет частный репозиторий.
то есть. псевдокод будет выглядеть следующим образом:
tag = something
if image:tag already exists on docker hub:
Do nothing
else
Build and push docker image with that tag
Ответы
Ответ 1
Пожалуйста, попробуйте этот
function docker_tag_exists() {
curl --silent -f -lSL https://index.docker.io/v1/repositories/$1/tags/$2 > /dev/null
}
if docker_tag_exists library/nginx 1.7.5; then
echo exist
else
echo not exists
fi
Update:
В случае использования Docker Registry v2 (на основе this):
# set username and password
UNAME="user"
UPASS="password"
function docker_tag_exists() {
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)
EXISTS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/$1/tags/?page_size=10000 | jq -r "[.results | .[] | .name == \"$2\"] | any")
test $EXISTS = true
}
if docker_tag_exists library/nginx 1.7.5; then
echo exist
else
echo not exists
fi
Ответ 2
Это решение, которое я использую с gitlab с помощью docker: stable image.
Убедитесь, что экспериментальные клиентские функции включены:
Установите для переменной среды DOCKER_CLI_EXPERIMENTAL
значение enabled
(см. ответ матей ниже)
В качестве альтернативы настройте конфиг (оригинальный ответ):
echo '{"experimental": "enabled"}' > ~/.docker/config.json
Это также перезапишет ваш конфиг. Если это не вариант, вам нужно сделать это вручную или использовать jq
, sed
или все, что у вас есть.
Вход
docker login -u $USER -p $PASSWORD $REGISTRY
Проверьте, есть ли там:
docker manifest inspect $IMGNAME:$IMGTAG > /dev/null ; echo $?
Docker вернет 0 в случае успеха или 1 в случае ошибки.
Ответ 3
Чтобы использовать смертельныйответ, обратите внимание, что докер поддерживает установку экспериментального флага с помощью переменной среды:
DOCKER_CLI_EXPERIMENTAL
Включить экспериментальные функции для Cli (например, enabled
или disabled
)
Таким образом, фрагмент становится следующим:
tag=something
if DOCKER_CLI_EXPERIMENTAL=enabled docker manifest inspect $image:$tag >/dev/null; then
Do nothing
else
Build and push docker image with that tag
fi
Ответ 4
Здесь функция Bash, которая поможет:
docker_image_exists() {
local image_full_name="$1"; shift
local wait_time="${1:-5}"
local search_term='Pulling|is up to date|not found'
local result="$((timeout --preserve-status "$wait_time" docker 2>&1 pull "$image_full_name" &) | grep -v 'Pulling repository' | egrep -o "$search_term")"
test "$result" || { echo "Timed out too soon. Try using a wait_time greater than $wait_time..."; return 1 ;}
echo $result | grep -vq 'not found'
}
Пример использования:
docker_image_exists elifarley/docker-dev-env:alpine-sshd && \
echo EXISTS || \
echo "Image does not exist"
Ответ 5
Самый простой:
docker pull alpine:invalid > /dev/null && echo "success" || echo "failed"
Извлекает и печатает успешно, если изображение существует, или печатает не удалось, если его нет:
Вы даже можете экспортировать его в var, если используете bash-скрипт:
![enter image description here]()
Ответ 6
Мне нравятся решения, основанные на докере.
Этот oneliner - то, что я использую в нашем CI:
docker run --rm anoxis/registry-cli -l user:password -r registry-url -i docker-name | grep -q docker-tag || echo do something if not found
Ответ 7
Просто небольшое улучшение решения Евгения Оськина. Когда дело доходит до пользовательского репозитория, который еще не был создан, jq говорит, что он "не может перебрать ноль". Чтобы преодолеть это. можно пропустить не существующие блоки с ? Вот модификация вышеупомянутого решения, которая применима, в частности, к публичному репо:
#!/usr/bin/env bash
function docker_image_tag_exists() {
EXISTS=$(curl -s https://hub.docker.com/v2/repositories/$1/tags/?page_size=10000 | jq -r "[.results? | .[]? | .name == \"$2\"] | any")
test ${EXISTS} = true
}
if docker_image_tag_exists $1 $2; then
echo "true"
else
echo "false"
fi
Ответ 8
Я пытался заставить это работать для частного репозитория концентратора докеров и, наконец, решил написать ruby script, который работает на сегодняшний день. Не стесняйтесь использовать!
#!/usr/bin/env ruby
require 'base64'
require 'net/http'
require 'uri'
def docker_tag_exists? repo, tag
auth_string = Base64.strict_encode64 "#{ENV['DOCKER_USER']}:#{ENV['DOCKER_PASSWORD']}"
uri = URI.parse("https://registry.hub.docker.com/v1/repositories/#{repo}/tags/#{tag}")
request = Net::HTTP::Get.new(uri)
request['Authorization'] = "Basic #{auth_string}"
request['Accept'] = 'application/json'
request['Content-Type'] = 'application/json'
response = Net::HTTP.start(request.uri.hostname, request.uri.port, use_ssl: true) do |http|
http.request(request)
end
(response.body == 'Tag not found') ? 0 : 1
end
exit docker_tag_exists? ARGV[0], ARGV[1]
Примечание: вам нужно указать DOCKER_USER и DOCKER_PASSWORD при вызове этого типа...
DOCKER_USER=XXX DOCKER_PASSWORD=XXX config/docker/docker_hub.rb "NAMESPACE/REPO" "TAG" && echo 'latest'
В этой строке будет напечатана "последняя", если аутентификация прошла успешно и указанный тег не существует! Я использовал это в своем Vagrantfile при попытке получить тег на основе текущей ветки git:
git rev-parse --symbolic-full-name --abbrev-ref HEAD
Ответ 9
Вы можете просто попробовать потянуть и посмотреть, если вы в курсе (вы можете сначала пометить локальное изображение, хотя в случае, если пульт более новый):
docker pull deepdriveio/deepdrive:env-3.0
env-3.0: Pulling from deepdriveio/deepdrive
Digest: sha256:3b6b6514f79a551b47896f908a2de00b55df1db22f5908c8436feaa12310dfa3
Status: Image is up to date for deepdriveio/deepdrive:env-3.0
Ответ 10
Вы пробовали что-то подобное, просто пытаясь вытащить тег и решили нажать или нет в соответствии с кодом возврата?
#! /bin/bash
if docker pull hello-world:linux > /dev/null; then
echo "already exist -> do not push"
else
echo "does not exist -> push"
fi