GitLab Runner: Crear imágenes Docker

Crea y publica imágenes Docker de forma eficiente desde tus pipelines de GitLab CI/CD utilizando runners de Stackhero y Docker-in-Docker

👋 ¡Bienvenido a la documentación de Stackhero!

Stackhero le ofrece una solución GitLab Runner cloud fácil de usar, diseñada para gestionar sus trabajos de GitLab CI/CD de manera eficiente. Esto es lo que puede esperar:

  • Minutos CI/CD ilimitados: no hay facturación por minuto, así que sus pipelines pueden ejecutarse siempre que lo necesite.
  • Múltiples trabajos concurrentes: ejecute varios trabajos al mismo tiempo para acelerar todo su pipeline.
  • Docker executor con soporte para Docker-in-Docker: simplifique la construcción y el push de sus imágenes de contenedor.
  • Compatible con GitLab.com y cualquier instancia GitLab autogestionada.
  • Una VM privada y dedicada impulsada por discos NVMe/SSD rápidos para builds consistentes y fiables.
  • Disponible en las regiones de 🇪🇺 Europa y 🇺🇸 USA.

Ahorre tiempo: puede conectar su primer GitLab Runner y empezar a ejecutar pipelines en solo unos minutos.

Con un Stackhero GitLab Runner, cada job se ejecuta dentro de un contenedor nuevo utilizando el ejecutor Docker. Puedes construir tus propias imágenes Docker directamente en tu pipeline habilitando Docker-in-Docker (DinD). Esta configuración lanza un daemon de Docker junto a tu job, permitiéndote ejecutar los comandos docker build y docker push como parte de tu proceso CI/CD.

Cada ejecución disfruta de minutos CI/CD ilimitados: puedes construir tantas veces como necesites, sin preocuparte por límites de uso. Tu caché de compilación se almacena en el disco dedicado del runner, lo que permite reutilizar capas de builds anteriores en ejecuciones repetidas. Esto reduce significativamente los tiempos de compilación y acelera la finalización de tus pipelines.

Puedes añadir el siguiente ejemplo de .gitlab-ci.yml a tu repositorio. Esta configuración construye el Dockerfile que se encuentra en la raíz de tu proyecto:

build-image:
  stage: build
  image: docker:29
  services:
    - docker:29-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker info
  script:
    # Sustituye "my-image" por el nombre que desees:
    - docker build -t my-image .
    # Opcionalmente, ejecuta una prueba rápida sobre la imagen construida:
    # - docker run --rm my-image /path/to/tests

En este ejemplo estamos usando la versión 29 de la imagen Docker. Puedes utilizar una versión más reciente si está disponible. Consulta las etiquetas más recientes en la página oficial de imágenes Docker.

En esta configuración, el servicio docker:29-dind inicia el daemon de Docker. Al establecer DOCKER_TLS_CERTDIR: "/certs" se habilita una conexión TLS segura entre tu job y el daemon de Docker.

GitLab proporciona variables predefinidas (CI_REGISTRY, CI_REGISTRY_USER, CI_REGISTRY_PASSWORD, CI_REGISTRY_IMAGE) para que tu pipeline pueda autenticarse y publicar imágenes en el registro de contenedores de tu proyecto de forma segura. No se requieren secretos adicionales.

Aquí tienes un ejemplo de job que construye y publica tu imagen:

build-and-push:
  stage: build
  image: docker:29
  services:
    - docker:29-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
  script:
    - docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" .
    - docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
    # Si estás en la rama principal, también puedes etiquetar y publicar "latest":
    - |
      if [ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]; then
        docker tag "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" "$CI_REGISTRY_IMAGE:latest"
        docker push "$CI_REGISTRY_IMAGE:latest"
      fi

Para publicar tus imágenes en otro registro (como Docker Hub o un registro privado), puedes almacenar las credenciales como variables CI/CD y usarlas con docker login de la misma manera.

El disco de tu runner se mantiene entre pipelines, permitiendo reutilizar las capas de imagen como caché de compilación. Esto puede hacer que los builds repetidos sean mucho más rápidos. Aquí tienes un ejemplo de configuración:

build-cached:
  stage: build
  image: docker:29
  services:
    - docker:29-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
  script:
    # Descarga la última imagen para inicializar la caché (si existe):
    - docker pull "$CI_REGISTRY_IMAGE:latest" || true
    - docker build --cache-from "$CI_REGISTRY_IMAGE:latest" -t "$CI_REGISTRY_IMAGE:latest" .
    - docker push "$CI_REGISTRY_IMAGE:latest"

Este enfoque permite que tus builds aprovechen la caché de capas de Docker, de modo que solo se reconstruyen las capas nuevas o modificadas.

Tu plan determina cuántos jobs pueden ejecutarse de forma concurrente. Los jobs en la misma etapa se inician juntos, hasta el límite de concurrencia que tengas configurado. Esto significa que varios jobs independientes pueden ejecutarse en paralelo y finalizar tan pronto como termine el más lento, en lugar de esperar a que cada uno termine en secuencia.

Ejemplo:

stages:
  - test

unit:
  stage: test
  image: node:22
  script: npm run test:unit

integration:
  stage: test
  image: node:22
  script: npm run test:integration

e2e:
  stage: test
  image: node:22
  script: npm run test:e2e

Si configuras la concurrencia en 1 o superior, los jobs unit, integration y e2e se ejecutarán al mismo tiempo.

Para más información sobre cómo construir imágenes Docker en pipelines de GitLab CI/CD, puedes consultar la documentación oficial de GitLab sobre el uso de builds Docker.