Подтвердить что ты не робот

Проверьте, существует ли комбинация изображений: тегов на докере-хабе

Как часть 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
4b9b3361

Ответ 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