Como parte de un script de bash, quiero comprobar si un particular ventana acoplable de imagen:etiqueta de combinación existe en docker hub. También, va a ser un repositorio privado.

es decir, el pseudocódigo sería:

tag = something
if image:tag already exists on docker hub:
    Do nothing
else
    Build and push docker image with that tag
Yo creo que tenemos el mismo problema. No estoy seguro si esto es relevante para usted, pero estamos ejecutando nuestro propio ventana acoplable de Registro, y se expone una API que puede utilizar. docs.docker.com/registry/spec/api/#listing-image-tags, probablemente voy a agregar un paso en mi CI construir las consultas a la API para que no sobrescribir una etiqueta existente.
Im sorprendido esto no es parte de la ventana acoplable repositorio de la API….

OriginalEl autor rgareth | 2015-08-20

5 Comentarios

  1. 20

    Por favor probar este

    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

    Actualización:

    En caso de uso de la ventana acoplable Registro v2 (basado en este):

    # 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
    ¿qué acerca de la no-ventana acoplable.io registros?
    ¿cuál usas? Por favor, compartir un enlace a la documentación.
    He actualizado el post con la función para la ventana acoplable Registro v2. Creo que, para usar esta función con los no-ventana acoplable.io registros que usted debe hacer lo siguiente: usar UNAME y UPASS adquiridos de aws ecr get-login comando; y aws_account_id.dkr.ecr.region.amazonaws.com como anfitrión.
    He aquí una secuencia de comandos para AWS ECR: gist.github.com/1ec2102c8c0d48592750b1f0b5306cc9
    Esto funciona para ECR: aws ecr describe-images --repository-name <repo> --image-ids imageTag=latest Esto eliminará la necesidad de crear cualquier curl/autorización.

    OriginalEl autor Evgeny Oskin

  2. 7

    Esta es la solución que yo uso con gitlab mediante la ventana acoplable:imagen estable.

    Asegúrese experimental cliente-características están habilitadas:

    echo '{"experimental": "enabled"}' > ~/.docker/config.json

    Esto también va a sobrescribir su configuración. Si eso no es una opción que usted necesita para hacerlo manualmente o utilizar jq, sed o lo que tengas disponible.

    De inicio de sesión

    docker login -u $USER -p $PASSWORD $REGISTRY

    Comprobar si existe:

    docker manifest inspect $IMGNAME:$IMGTAG > /dev/null ; echo $?

    ventana acoplable se devuelven 0 en caso de éxito o 1 en caso de error.

    Vergüenza que esto es todavía experimental
    en realidad su primer comando sobrescribirá todo el fichero de configuración, por lo que vale la pena agregar esta cadena mediante la edición del archivo
    Sí, he de mencionar que a la derecha abajo que felicitar…..

    OriginalEl autor morty

  3. 2

    Aquí un Bash función que le ayudará a:

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

    Ejemplo de uso:

    docker_image_exists elifarley/docker-dev-env:alpine-sshd && \
      echo EXISTS || \
      echo "Image does not exist"
    Que parece que comprueba la imagen de la existencia tratando de tirar de ella, que es una exageración – y si tiene éxito, va a cambiar las imágenes en el host local.
    No trate de tirar de él, pero el guión aborta la operación si tirando de la imagen tiene más que el valor de tiempo de espera (5 segundos por defecto).
    Ah, justo lo suficiente. Puede ser útil añadir un poco de explicación a la respuesta, va a través de lo que hace y no hace?
    podría alguien escriba un script de bash que utiliza la api de lugar?
    Después de la ejecución de este, parece que docker pull en una imagen se rompe la asociación de la imagen con todos los contenedores de la imagen. Ser cauteloso, esta función hará que los efectos secundarios en su ejecución contenedores!

    OriginalEl autor Elifarley

  4. 1

    Me gusta soluciones basadas en la ventana acoplable.

    Este oneliner es lo que yo uso en nuestra 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

    OriginalEl autor ramigg

  5. 0

    Yo estaba luchando por conseguir que esto funcione para un privado docker hub repositorio y finalmente se decidió a escribir un script en ruby lugar, que funciona como el de hoy. Siéntase libre de utilizar!

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

    Nota: debe especificar DOCKER_USER y DOCKER_PASSWORD cuando se llama a esta como…

    DOCKER_USER=XXX DOCKER_PASSWORD=XXX config/docker/docker_hub.rb "NAMESPACE/REPO" "TAG" && echo 'latest'

    Esta línea sería imprimir ‘último’, si la autenticación es exitosa, y la etiqueta especificada no existe! Yo estaba usando esto en mi Vagrantfile cuando se trata de recuperar una etiqueta basada en la actual git branch:

    git rev-parse --symbolic-full-name --abbrev-ref HEAD

    OriginalEl autor mfittko

Dejar respuesta

Please enter your comment!
Please enter your name here