Saltar al contenido
Hugo Méndez
  • Angular
  • Pruebas
  • Docker
  • CI

Pruebas de Angular en Docker o CI: "Running as root without --no-sandbox is not supported"

Cómo correr las pruebas de Karma con ChromeHeadless dentro de un contenedor o pipeline de CI sin que Chrome se niegue a arrancar: launcher personalizado, flags y variables.

Hugo Méndez9 de junio de 20262 min de lectura

Tus pruebas pasan en tu laptop, las mandas al pipeline o a un contenedor, y Karma se queda esperando hasta morir con alguno de estos mensajes:

Running as root without --no-sandbox is not supported.
No usable sandbox! Update your kernel or see ...
ChromeHeadless have not captured in 60000 ms, killing.

La causa casi siempre es la misma: dentro de un contenedor Chrome corre como root y sin el aislamiento (sandbox) que espera, así que se niega a arrancar.

La solución: un launcher propio

En karma.conf.js define un navegador basado en ChromeHeadless con las banderas necesarias:

module.exports = function (config) {
  config.set({
    // ...
    browsers: ['ChromeHeadless'],
    customLaunchers: {
      ChromeHeadlessCI: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu'],
      },
    },
    captureTimeout: 120000,
    browserNoActivityTimeout: 120000,
  });
};

Y en el pipeline:

npx ng test --watch=false --browsers=ChromeHeadlessCI

Para qué sirve cada bandera:

  • --no-sandbox: permite que Chrome arranque como root dentro del contenedor.
  • --disable-dev-shm-usage: evita fallos por la memoria compartida pequeña (/dev/shm) que traen muchos contenedores.
  • --disable-gpu: no hay GPU en el servidor; evita advertencias y cuelgues.

Usa estas banderas solo en CI o contenedores de prueba, nunca para navegar sitios reales: el sandbox es una protección importante.

“Cannot start ChromeHeadless: No binary”

Si el contenedor ni siquiera tiene Chrome, Karma busca la variable CHROME_BIN. Dos formas de resolverlo:

# Opción 1: instalar Chromium en la imagen (Debian/Ubuntu)
RUN apt-get update && apt-get install -y chromium && rm -rf /var/lib/apt/lists/*
ENV CHROME_BIN=/usr/bin/chromium
// Opción 2: usar el Chrome que descarga Puppeteer
process.env.CHROME_BIN = require('puppeteer').executablePath();

Pruebas lentas o intermitentes

  • Sube captureTimeout y browserNoActivityTimeout en servidores lentos.
  • Corre con --source-map=false si el proyecto es muy grande.
  • Si todo el equipo usa el mismo launcher, déjalo como navegador por defecto en CI con una variable de entorno:
browsers: [process.env.CI ? 'ChromeHeadlessCI' : 'Chrome'],

Con eso tus pruebas corren igual en tu máquina, en Docker y en el pipeline. Y si el proyecto es nuevo, vale la pena evaluar Vitest o Jest, que no necesitan un navegador real para la mayoría de las pruebas unitarias.

Volver al blog

Servicios relacionados

¿Tienes un proceso que ya no aguanta más Excel?

Cuéntame qué necesitas. En menos de 24 horas hábiles te respondo con una idea clara de cómo resolverlo y cuánto cuesta.