Contrato de entorno de ejecución de contenedor

En esta página se enumeran los requisitos y comportamientos clave de los contenedores en Cloud Run. Hay algunas diferencias entre los servicios de Cloud Run y los trabajos de Cloud Run, que se indican cuando es necesario.

Idiomas e imágenes admitidos

Tu imagen de contenedor puede ejecutar código escrito en el lenguaje de programación que elijas y usar cualquier imagen base, siempre que respete las restricciones que se indican en esta página.

Los ejecutables de la imagen del contenedor deben compilarse para Linux de 64 bits. Cloud Run admite específicamente el formato ABI de Linux x86_64.

Cloud Run acepta imágenes de contenedor en los formatos de imagen Docker Image Manifest V2, Schema 1, Schema 2 y OCI. Cloud Run también acepta imágenes de contenedor comprimidas con Zstd.

Si vas a implementar una imagen de varias arquitecturas, la lista de manifiestos debe incluir linux/amd64.

En el caso de las funciones desplegadas con Cloud Run, puedes usar una de las imágenes base del tiempo de ejecución de Cloud Run que publican los paquetes de compilación de Google Cloud para recibir actualizaciones automáticas de seguridad y mantenimiento. Consulta la programación de asistencia de tiempo de ejecución para ver los tiempos de ejecución compatibles.

Escuchar las solicitudes en el puerto correcto (servicios)

Un servicio de Cloud Run inicia instancias de Cloud Run para gestionar las solicitudes entrantes. Una instancia de Cloud Run siempre tiene un solo contenedor de entrada que escucha las solicitudes y, opcionalmente, uno o varios contenedores sidecar. Los siguientes detalles de configuración de puertos solo se aplican al contenedor de entrada, no a los sidecars.

El contenedor de entrada de una instancia debe recibir solicitudes en 0.0.0.0 en el puerto al que se envían las solicitudes. En concreto, el contenedor de entrada no debe escuchar en 127.0.0.1. De forma predeterminada, las solicitudes se envían a 8080, pero puedes configurar Cloud Run para que envíe solicitudes al puerto que elijas. Cloud Run inserta la variable de entorno PORT en el contenedor de entrada.

El contenedor que se ejecuta en una ejecución de trabajo debe salir al finalizar

En el caso de las tareas de Cloud Run, el contenedor debe salir con el código de salida 0 cuando la tarea se haya completado correctamente y con un código de salida distinto de cero cuando la tarea haya fallado.

Como los trabajos no deben atender solicitudes, el contenedor no debe escuchar en un puerto ni iniciar un servidor web.

Cifrado de la capa de transporte (TLS)

El contenedor no debe implementar ninguna seguridad de la capa de transporte directamente. Cloud Run finaliza TLS para HTTPS y gRPC. Después, las solicitudes se envían como proxy a HTTP/1 o gRPC al contenedor sin TLS.

Si configuras un servicio de Cloud Run para usar HTTP/2 de extremo a extremo, tu contenedor debe gestionar las solicitudes en formato de texto sin cifrar HTTP/2 (h2c), ya que Cloud Run sigue terminando TLS automáticamente.

Respuestas (servicios)

En el caso de los servicios de Cloud Run, el contenedor debe enviar una respuesta en el plazo especificado en el ajuste de tiempo de espera de la solicitud después de recibir una solicitud, incluido el tiempo de inicio del contenedor. De lo contrario, la solicitud se finaliza y se devuelve un error 504.

Almacenamiento en caché de respuestas y cookies

Si la respuesta de tu servicio de Cloud Run contiene un encabezado Set-Cookie, Cloud Run define el encabezado Cache-Control como private para que la respuesta no se almacene en caché. De esta forma, se evita que otros usuarios recuperen la cookie.

Variables de entorno

Hay distintos conjuntos de variables de entorno disponibles para los servicios y los trabajos de Cloud Run.

Variables de entorno de los servicios

Las siguientes variables de entorno se añaden automáticamente a todos los contenedores en ejecución, excepto PORT. La variable PORT solo se añade al contenedor de entrada:

Nombre Descripción Ejemplo
PORT Puerto en el que debe escuchar tu servidor HTTP. 8080
K_SERVICE Nombre del servicio de Cloud Run que se está ejecutando. hello-world
K_REVISION Nombre de la revisión de Cloud Run que se está ejecutando. hello-world.1
K_CONFIGURATION Nombre de la configuración de Cloud Run que ha creado la revisión. hello-world

Variables de entorno de los trabajos

En el caso de los trabajos de Cloud Run, se definen las siguientes variables de entorno:

Nombre Descripción Ejemplo
CLOUD_RUN_JOB Nombre del trabajo de Cloud Run que se está ejecutando. hello-world
CLOUD_RUN_EXECUTION Nombre de la ejecución de Cloud Run que se está ejecutando. hello-world-abc
CLOUD_RUN_TASK_INDEX Índice de esta tarea. Empieza en 0 para la primera tarea y aumenta en 1 por cada tarea sucesiva, hasta el número máximo de tareas menos 1. Si asignas a --parallelism un valor superior a 1, es posible que las tareas no sigan el orden del índice. Por ejemplo, la tarea 2 podría empezar antes que la tarea 1. 0
CLOUD_RUN_TASK_ATTEMPT El número de veces que se ha intentado la ejecución de esta tarea. Empieza en 0 en el primer intento y aumenta en 1 en cada reintento sucesivo hasta alcanzar el valor máximo de reintentos. 0
CLOUD_RUN_TASK_COUNT Número de tareas definidas en el parámetro --tasks. 1

Requisitos de los encabezados de solicitud y respuesta (servicios)

En el caso de los servicios de Cloud Run, los nombres de los encabezados solo pueden incluir caracteres ASCII imprimibles que no sean espacios en blanco y no pueden contener dos puntos. Los valores de los encabezados solo pueden contener caracteres ASCII visibles, espacios y tabulaciones horizontales, tal como se indica en el RFC 7230 del IETF.

Acceso al sistema de archivos

El sistema de archivos de cada uno de tus contenedores se puede escribir y está sujeto al siguiente comportamiento:

  • Se trata de un sistema de archivos en memoria, por lo que escribir en él usa la memoria de la instancia.
  • Los datos escritos en el sistema de archivos no se conservan cuando se detiene la instancia.

Ten en cuenta que no puedes especificar un límite de tamaño para este sistema de archivos, por lo que puedes agotar toda la memoria asignada a tu instancia escribiendo en el sistema de archivos en memoria, lo que provocará que la instancia falle. Puedes evitar este problema si usas un volumen en memoria específico con un límite de tamaño.

Ciclo de vida de la instancia

Las características del ciclo de vida de los trabajos y servicios de Cloud Run son diferentes, por lo que se describen por separado en las siguientes subsecciones.

Para servicios

Las siguientes condiciones se aplican únicamente a los servicios.

Escalado de servicios

De forma predeterminada, un servicio de Cloud Run se escala automáticamente al número de instancias necesarias para gestionar todas las solicitudes, eventos o uso de CPU entrantes. Si necesitas tener más control sobre el comportamiento del escalado, puedes usar el escalado manual.

Cada instancia ejecuta un número fijo de contenedores: un contenedor de entrada y, opcionalmente, uno o varios contenedores sidecar.

Cuando una revisión no recibe tráfico, se reduce al número mínimo de instancias configurado (cero de forma predeterminada).

Startup

En el caso de los servicios de Cloud Run, las instancias deben escuchar las solicitudes en un plazo de 4 minutos después de iniciarse y todos los contenedores de la instancia deben estar en buen estado. Durante este tiempo de inicio, se asigna CPU a las instancias. Puedes habilitar el aumento de la CPU al inicio para aumentar temporalmente la asignación de CPU durante el inicio de la instancia y, de este modo, reducir la latencia de inicio.

Las solicitudes se enviarán al contenedor de entrada en cuanto esté escuchando en el puerto configurado.

Una solicitud que espere una instancia se mantendrá pendiente en una cola de la siguiente manera:

Las solicitudes se quedarán pendientes hasta 3, 5 veces el tiempo medio de inicio de las instancias de contenedor de este servicio o 10 segundos, lo que sea mayor.

Puedes configurar una prueba de inicio para determinar si el contenedor se ha iniciado y está listo para atender solicitudes.

En el caso de un servicio de Cloud Run que conste de instancias de varios contenedores, puedes especificar la secuencia en la que se inician los contenedores dentro de la instancia configurando el orden de inicio de los contenedores.

Procesar una solicitud

En los servicios de Cloud Run, la CPU siempre se asigna a todos los contenedores, incluidos los sidecars de una instancia, siempre que la revisión de Cloud Run esté procesando al menos una solicitud.

Inactivo

En el caso de los servicios de Cloud Run, una instancia inactiva es aquella que no está procesando ninguna solicitud.

La CPU asignada a todos los contenedores de una instancia inactiva depende de la configuración de facturación.

A menos que una instancia deba permanecer inactiva debido a la configuración del número mínimo de instancias, no permanecerá inactiva durante más de 15 minutos.

Apagar

En el caso de los servicios de Cloud Run, una instancia inactiva se puede cerrar en cualquier momento, incluidas las instancias que se mantienen activas debido a un número mínimo de instancias configurado. Si es necesario apagar una instancia que está procesando solicitudes, se les da tiempo a las solicitudes que ya se están procesando para que se completen y las nuevas solicitudes entrantes se dirigen a otras instancias. En casos excepcionales, Cloud Run puede iniciar un cierre y enviar una señal SIGTERM a un contenedor que aún esté procesando solicitudes.

Antes de apagar una instancia, Cloud Run envía una señal SIGTERM a todos los contenedores de la instancia, lo que indica el inicio de un periodo de 10 segundos antes de que se produzca el apagado real, momento en el que Cloud Run envía una señal SIGKILL. Durante este periodo, se asigna CPU a la instancia y se factura. En los servicios que usan el entorno de ejecución de primera generación, si la instancia no intercepta la señal SIGTERM, se cierra inmediatamente. En los servicios que usan el entorno de ejecución de segunda generación, te recomendamos que instales un controlador SIGTERM en tu contenedor para recibir una advertencia cuando Cloud Run esté a punto de cerrar una instancia.

Cancelación forzada

Si uno o varios contenedores de Cloud Run superan el límite de memoria total del contenedor, se terminará la instancia. Todas las solicitudes que aún se estén procesando en la instancia terminarán con un error HTTP 500.

Para empleos

En el caso de los trabajos de Cloud Run, las instancias de contenedor se ejecutan hasta que se cierran, hasta que se alcanza el tiempo de espera de la tarea o hasta que el contenedor falla.

Códigos de salida

Puedes usar los códigos de salida de los trabajos para ver si se han completado correctamente o si se ha producido algún error. Los códigos de salida son valores numéricos que se asignan a la finalización correcta o a tipos específicos de errores.

En la siguiente tabla se especifican los códigos de salida habituales y sus definiciones:

Código de salida Señal Descripción
0 La tarea se ha completado correctamente.
4 SIGILL La tarea ha intentado acceder a la memoria en una dirección incorrecta.
7 SIGBUS La tarea ha intentado acceder a la memoria fuera de los límites asignados.
9 SIGKILL La tarea se finaliza de forma forzada, ya sea por acción del usuario o por intervención manual.
11 SIGSEGV La tarea ha intentado acceder a una memoria no autorizada.
15 SIGTERM Cuando una tarea supera el tiempo de espera configurado, recibe una señal SIGTERM. El servidor de aplicaciones envía la señal SIGTERM para que se cierre la instancia de contenedor. Si la instancia no se cierra sola en unos segundos después de recibir SIGTERM, Cloud Run envía una señal SIGKILL para forzar la finalización. Si la instancia se cierra correctamente con SIGTERM, puede devolver un código de error diferente. De lo contrario, devuelve SIGTERM.

Cancelación forzada

Se termina una instancia de contenedor de Cloud Run que supera el límite de memoria permitido. Todas las solicitudes que aún se están procesando en la instancia de contenedor terminan con un error HTTP 500.

Si una tarea supera el tiempo de espera de la tarea, Cloud Run envía una señal "SIGTERM" que indica el inicio de un periodo de 10 segundos antes de que se produzca el cierre real, momento en el que Cloud Run envía una señal SIGKILL, que cierra la instancia de contenedor.

Durante este periodo, se asigna CPU a las instancias de contenedor durante todo su ciclo de vida y se facturan.

Consulta el código de muestra de SIGTERM para saber cómo interceptar la señal SIGTERM.

Recursos de instancias de contenedor

En las siguientes secciones se describen los recursos de tu instancia de contenedor:

CPU

De forma predeterminada, a cada contenedor de Cloud Run de una instancia se le asigna la vCPU que se haya configurado (1 de forma predeterminada). Es posible configurar los límites de CPU de cada contenedor por separado.

Una vCPU se implementa como una abstracción del hardware subyacente para proporcionar el tiempo de CPU aproximado equivalente a un hiperhilo de hardware único en plataformas de CPU variables. Todas las plataformas de CPU que usa Cloud Run admiten el conjunto de instrucciones AVX2. Ten en cuenta que el contrato de contenedor no contiene ningún detalle adicional sobre la plataforma de CPU.

El contenedor se puede ejecutar en varios núcleos simultáneamente.

En el caso de los servicios de Cloud Run, la asignación de CPU depende de la facturación seleccionada.

Si seleccionas la facturación basada en instancias, la CPU se asigna durante la vida útil de la instancia. Si selecciona la facturación basada en solicitudes (opción predeterminada), la CPU se asigna cuando las instancias procesan solicitudes. Para obtener más información, consulta la configuración de facturación.

Si has configurado un número de instancias mínimas, debes usar la facturación basada en instancias para que la CPU se asigne fuera de las solicitudes.

Puedes habilitar el aumento de la CPU al inicio para aumentar temporalmente la asignación de CPU durante el inicio de la instancia y, de este modo, reducir la latencia de inicio.

Memoria

De forma predeterminada, a cada contenedor de Cloud Run se le asigna la memoria que se haya configurado (512 MiB de forma predeterminada). Es posible configurar los límites de memoria de cada contenedor por separado.

Entre los usos habituales de la memoria se incluyen los siguientes:

  • Código cargado en la memoria para ejecutar el servicio.
  • Escribir en el sistema de archivos
  • Procesos adicionales que se ejecutan en el contenedor, como un servidor nginx
  • Sistemas de almacenamiento en caché en memoria, como OpCache de PHP
  • Uso de memoria por solicitud
  • Volúmenes compartidos en memoria

GPU

Puedes configurar un contenedor en una instancia de Cloud Run para que acceda a una GPU. Si el servicio de Cloud Run se despliega con contenedores sidecar, solo un contenedor del despliegue puede acceder a la GPU. Consulta los requisitos y los detalles para configurar la GPU.

Bibliotecas de NVIDIA

De forma predeterminada, todas las bibliotecas de controladores de NVIDIA L4 se montan en /usr/local/nvidia/lib64. Cloud Run añade automáticamente esta ruta a la variable de entorno LD_LIBRARY_PATH (es decir, ${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64) del contenedor con la GPU. Esto permite que el enlazador dinámico encuentre las bibliotecas de controladores de NVIDIA. El enlazador busca y resuelve las rutas en el orden en que se indican en la variable de entorno LD_LIBRARY_PATH. Los valores que especifiques en esta variable tendrán prioridad sobre la ruta predeterminada de las bibliotecas del controlador de Cloud Run /usr/local/nvidia/lib64.

Si quieres usar una versión de CUDA superior a 12.2, la forma más sencilla es depender de una imagen base de NVIDIA más reciente con paquetes de compatibilidad con versiones posteriores ya instalados. Otra opción es instalar manualmente los paquetes de compatibilidad con versiones anteriores de NVIDIA y añadirlos a LD_LIBRARY_PATH. Consulta la matriz de compatibilidad de NVIDIA para determinar qué versiones de CUDA son compatibles con la versión del controlador de NVIDIA proporcionada (535.216.03).

Simultaneidad (servicios)

En el caso de los servicios de Cloud Run, cada instancia de Cloud Run tiene asignada de forma predeterminada una concurrencia múltiple, por lo que el contenedor de entrada puede recibir más de una solicitud al mismo tiempo. Puedes cambiarlo configurando la simultaneidad.

Entorno aislado de contenedores

Si usas el entorno de ejecución de primera generación, los contenedores de Cloud Run se ejecutan en un espacio aislado mediante el espacio aislado del entorno de ejecución de contenedores gVisor. Como se indica en la referencia de compatibilidad de llamadas al sistema de gVisor, es posible que este sandbox de contenedores no admita algunas llamadas al sistema.

Si usas el entorno de ejecución de segunda generación, tienes compatibilidad total con Linux. Los trabajos de Cloud Run siempre usan el entorno de ejecución de segunda generación. En el entorno de ejecución de segunda generación, /sys/class/dmi/id/product_name se define como Google Compute Engine.

El entorno de ejecución de segunda generación ejecuta el código de tu servicio en un espacio de nombres de proceso independiente, por lo que se inicia como el proceso init del contenedor, que tiene una semántica de proceso especial. En el entorno de ejecución de primera generación, el código de tu servicio no se ejecuta como proceso init del contenedor.

Límites de descriptores de archivos

Los entornos de primera y segunda generación de Cloud Run limitan a 25.000 el número de descriptores de archivo que puede abrir un proceso. Esto se aplica al contenedor y a cualquier proceso secundario que cree (forks). Este es un límite estricto. Si superas el límite, es posible que tu instancia se quede sin descriptores de archivos o sockets.

Límites en el entorno de segunda generación

Los límites del entorno de segunda generación son los límites estándar de Linux.

Por ejemplo, los límites del número de descriptores de archivos que se pueden abrir (como se indica en /proc/sys/fs/file-max) usan el valor predeterminado de aproximadamente el 10% de la memoria. Consulta más información sobre file-max y file-nr en la documentación del kernel.

Del mismo modo, max_map_count (como se muestra en /proc/sys/vm/max_map_count), que define el número de áreas de memoria que puede tener un proceso, usa el valor predeterminado 65535. Consulta los detalles en la max-map-count de la documentación del kernel.

Contenedores con privilegios y binarios setuid

Cloud Run no admite contenedores con privilegios. Por lo tanto, Cloud Run no admite archivos binarios que usen marcas setuid para usuarios que no sean root, como gcsfuse o sudo, y puede que se produzca un error debido a que no hay permisos suficientes.

Otra alternativa es ejecutar estos archivos binarios como usuario root y, a continuación, usar el comando su para cambiar a otro usuario en tiempo de ejecución.

Por ejemplo, en tu archivo Dockerfile, elimina la instrucción USER y, en tu secuencia de comandos de punto de entrada, usa la siguiente secuencia:

gcsfuse ...                 # Run gcsfuse as root
su myuser -c "/yourapp.sh"  # Switch to 'myuser' and run 'yourapp.sh'

Usuario que ejecuta

Si el nombre de usuario no existe, Cloud Run ejecuta el contenedor como usuario root (uid=0).

Servidor de metadatos de instancias

Las instancias de Cloud Run exponen un servidor de metadatos que puedes usar para obtener detalles sobre tus contenedores, como el ID del proyecto, la región, el ID de la instancia o las cuentas de servicio. También puedes usar el servidor de metadatos para generar tokens para la identidad de servicio.

Para acceder a los datos del servidor de metadatos, usa solicitudes HTTP al endpoint http://metadata.google.internal/ con el encabezado Metadata-Flavor: Google. No se necesitan bibliotecas de cliente. Para obtener más información, consulta Obtener metadatos.

En la siguiente tabla se muestra información del servidor de metadatos disponibles:

Ruta Descripción
/computeMetadata/v1/project/project-id ID del proyecto al que pertenece el servicio o el trabajo de Cloud Run
/computeMetadata/v1/project/numeric-project-id Número del proyecto al que pertenece el servicio o el trabajo de Cloud Run
/computeMetadata/v1/instance/region Región de este servicio o trabajo de Cloud Run. Devuelve projects/PROJECT-NUMBER/regions/REGION.
/computeMetadata/v1/instance/id Identificador único de la instancia (también disponible en los registros).
/computeMetadata/v1/instance/service-accounts/default/email Correo de la identidad de servicio de este servicio o trabajo de Cloud Run.
/computeMetadata/v1/instance/service-accounts/default/token Genera un token de acceso OAuth2 para la cuenta de servicio de este servicio o trabajo de Cloud Run. El agente de servicio de Cloud Run se usa para obtener un token. Este endpoint devolverá una respuesta JSON con un atributo access_token. Más información sobre cómo extraer y usar este token de acceso

Ten en cuenta que Cloud Run no proporciona detalles sobre la Google Cloud zona en la que se ejecutan las instancias. Por lo tanto, el atributo de metadatos /computeMetadata/v1/instance/zone siempre devuelve projects/PROJECT-NUMBER/zones/REGION-1.

Nombres de archivo

Los nombres de los archivos que utilices en los contenedores deben ser compatibles con UTF-8, es decir, deben estar en formato UTF-8 o en un formato que se pueda convertir automáticamente a UTF-8 sin problemas. Si los nombres de tus archivos usan codificaciones diferentes, ejecuta la compilación de Docker en una máquina con nombres de archivo compatibles con UTF-8 y evita copiar archivos en un contenedor que contenga nombres UTF-8 incompatibles.

La implementación del contenedor falla si los nombres de los archivos no son compatibles con UTF-8. Ten en cuenta que no hay ninguna restricción en la codificación de caracteres que utilices en un archivo.

Tiempos de espera de solicitudes salientes

En el caso de los servicios y los trabajos de Cloud Run, hay un tiempo de espera de 10 minutos después de que las solicitudes de tu contenedor a la VPC estén inactivas. En el caso de las solicitudes de tu contenedor a Internet, hay un tiempo de espera de 20 minutos de inactividad.

Restablecimientos de conexiones salientes

Las secuencias de conexión de tu contenedor a la VPC y a Internet se pueden terminar y sustituir ocasionalmente cuando se reinicia o se actualiza la infraestructura subyacente. Si tu aplicación reutiliza conexiones de larga duración, te recomendamos que la configures para que restablezca las conexiones y así evitar que se reutilice una conexión inactiva.