es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Reglas de Bazel: empujar el contenedor de Docker con la etiqueta del hash SHA-256 de la imagen Docker.

Me gustaría subir una imagen de Docker a un registro con una etiqueta que corresponda al hash SHA-256 de la imagen. Estoy utilizando Bazel y más específicamente container_push de docker_rules. Desafortunadamente, no puedo obtener el hash de la imagen y etiquetarla con él.

Suponiendo que tengo la siguiente configuración en el archivo BUILD.bazel, ¿cómo puedo hacer esto? 🙏

go_image(
    name = "image",
    embed = [":app1_lib"],
    goarch = "amd64",
    goos = "linux",
)

container_push(
    name = "publish",
    format = "Docker",
    image = ":image",
    registry = DOCKER_REGISTRY,
    repository = "app1",
    skip_unchanged_digest = True,
    tag = "{ ??? }",
)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para etiquetar la imagen Docker con su digest SHA-256, puedes utilizar la regla container_image de docker_rules para crear una imagen Docker temporal con un prefijo de etiqueta conocido, luego utilizar docker save para exportar la imagen a un archivo tar, pasarlo por sha256sum para calcular el digest y utilizar eso para etiquetar la imagen Docker original antes de empujarla al registro.

    Aquí hay una versión actualizada del archivo BUILD.bazel que demuestra este enfoque:

    load("@io_bazel_rules_docker//docker:docker.bzl", "container_image", "container_push")
    
    # Define una imagen Docker temporal que se utilizará para calcular el digest SHA-256
    container_image(
        name = "image_tmp",
        base = ":image",
        tags = ["tmp"],
    )
    
    # Exporta la imagen temporal a un archivo tar, pasa por sha256sum para calcular el
    # digest, y asigna el hash resultante a la variable "digest" usando shellcheck
    sh_binary(
        name = "digest",
        srcs = [
            "@io_bazel_rules_docker//tools:dockertools",
            ":image_tmp.tar",
        ],
        cmd = "set -euo pipefail && docker load < $(pwd)/$< | sha256sum | cut -d' ' -f1",
        output_files = ["digest"],
    )
    
    # Empuja la imagen Docker original al registro con el digest calculado como etiqueta
    container_push(
        name = "publish",
        format = "Docker",
        image = ":image",
        registry = DOCKER_REGISTRY,
        repository = "app1",
        skip_unchanged_digest = True,
        tag = "$(cat $(location digest))",
    )
    

    En esta versión del archivo, hemos agregado dos nuevas reglas:

    • container_image, que crea una imagen Docker temporal (:image_tmp) utilizando la misma imagen base que :image, pero con una etiqueta única (tmp), lo que nos permite identificarla más tarde.
    • sh_binary, que exporta la imagen Docker temporal a un archivo tar, pasa por sha256sum para calcular el digest y guarda el hash en un archivo llamado digest.

    Luego, hemos actualizado el atributo tag de la regla container_push para utilizar una expansión $() que lee el digest del archivo digest utilizando $(cat $(location digest)).

    Con estos cambios, al ejecutar bazel run :publish se construirá y empujará la imagen Docker al registro con una etiqueta que refleje su digest SHA-256.

    Ten en cuenta que este enfoque requiere depender de comandos de shell para extraer el digest de la imagen exportada, lo que puede no estar disponible o comportarse de manera consistente en diferentes entornos. Para un control más preciso sobre el digest de la imagen, considera utilizar una herramienta dedicada como skopeo.

Comments are closed.