bash - hub - docker store
Compruebe si la imagen: la combinaciĆ³n de etiquetas ya existe en el hub docker (5)
Aquí hay una función Bash que ayudará:
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"
Como parte de un script bash, quiero comprobar si existe una combinación de imagen: ventana acoplable en particular en el centro de la ventana acoplable. Además, será un repositorio privado.
Es decir, el pseudocódigo sería como:
tag = something
if image:tag already exists on docker hub:
Do nothing
else
Build and push docker image with that tag
Esta es la solución que uso con gitlab usando la ventana acoplable: imagen estable.
Asegúrese de que las características experimentales del cliente estén habilitadas:
echo ''{"experimental": "enabled"}'' > ~/.docker/config.json
Esto también sobrescribirá tu configuración. Si esa no es una opción, debe hacerlo manualmente o usar jq
, sed
o lo que tenga disponible.
Iniciar sesión
docker login -u $USER -p $PASSWORD $REGISTRY
Compruebe si está allí:
docker manifest inspect $IMGNAME:$IMGTAG > /dev/null ; echo $?
la ventana acoplable devolverá 0 en caso de éxito o 1 en caso de fallo.
Estaba luchando para que esto funcionara para un repositorio de concentrador de ventana acoplable privado y finalmente decidí escribir un script ruby, que funciona a partir de hoy. Siéntase libre de usar!
#!/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 al llamar a esto como ...
DOCKER_USER=XXX DOCKER_PASSWORD=XXX config/docker/docker_hub.rb "NAMESPACE/REPO" "TAG" && echo ''latest''
¡Esta línea imprimirá ''más reciente'', si la autenticación es exitosa y la etiqueta especificada no existe! Estaba usando esto en mi Vagrantfile cuando intentaba buscar una etiqueta basada en la rama de git actual:
git rev-parse --symbolic-full-name --abbrev-ref HEAD
Me gustan las soluciones basadas en docker.
Este oneliner es lo que uso en nuestro IC:
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
Por favor, pruebe 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
Actualizar:
En caso de uso Docker Registry v2 (basado en 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