La compilación falla en el paso de compilación y envío («push»)

Después de crear y ejecutar una compilación, esta no se completa correctamente y se recibe un mensaje que indica que la compilación falla en el paso de compilación y envío.

El paso de compilación y envío es el paso principal de una compilación de Code Engine.

  • Si ha elegido la estrategia de compilación de Dockerfile, BuildKit analiza el archivo Dockerfile, realiza los pasos que se describen allí para crear una imagen de contenedor y la envía.

  • Si elige la estrategia de compilación de los paquetes de compilación, compruebe los archivos del directorio de origen para determinar qué tipo de compilación se solicita. Por ejemplo, si el directorio de origen contiene un pom.xml, los paquetes de compilación presuponen que se trata de un tipo Maven y ejecutan una compilación de paquete mvn -Dmaven.test.skip=true. Si se encuentra un archivo package.json, se presupone que la compilación es para una aplicación Node.js y se ejecuta npm install. El resultado se empaqueta en una imagen junto con el entorno de ejecución necesario y se envía al registro de contenedores.

    Mensaje de error de ejemplo

    Summary: Failed to execute build run
    Reason:  "step-build-and-push" exited with code 1 (image: "icr.io/obs/codeengine/buildkit/builder:v0.9.0-rc.19@sha256:a11e2348f9ee40822fc28dcb501c57cd02ebd31fb441841bfe5c144cc9d77fc6"); for logs run: kubectl -n <PROJECT_NAMESPACE> logs <BUILDRUN_NAME>-865rg-pod-m5lrs -c step-build-and-push
    

    Para determinar la causa raíz, consulte el registro del paso. Ejecute el mandato ibmcloud ce buildrun logs. Céntrese en los registros correspondientes al paso anómalo,

    ibmcloud ce buildrun logs -n <BUILDRUN_NAME>
    

En la tabla siguiente se describe el texto de error y las causas raíz potenciales para este caso de ejemplo.

Texto de error y causas raíz para los pasos de compilación y envío
El mensaje de error contiene Estrategia Causas raíz potenciales
Killed Dockerfile, Buildpacks
  • Se ha alcanzado el límite de memoria.
error checking pushed permissions

ERROR: failed to export: failed to write image to the following tags: [...] UNAUTHORIZED

ERROR: failed to export: failed to write image to the following tags: [...] unsupported status code 401

Dockerfile

Paquetes de compilación

Paquetes de compilación

  • El secreto de registro de contenedor no está definido.
  • El secreto de registro de contenedor no es del tipo correcto.
  • El secreto de registro de contenedor no es para el registro de contenedor correcto.
  • El secreto de registro de contenedor no permite enviar al registro de contenedor.
error: failed to solve: failed to read dockerfile: open /tmp/buildkit-mount306846082/Dockerfile: no such file or directory Dockerfile
  • El archivo Dockerfile no está en el directorio raíz del repositorio de origen.
  • El repositorio de origen no contiene ningún Dockerfile.
error: failed to solve: unexpected status: 403 Forbidden
DENIED: You have exceeded your storage quota. Delete one or more images, or review your storage quota and pricing plan. For more information, see https://ibm.biz/BdjFwL
Dockerfile, Buildpacks
  • Se está utilizando IBM Cloud® Container Registry y se ha alcanzado un límite de cuota.
ERROR: No buildpack groups passed detection. Paquetes de compilación
  • El origen de la compilación no se ha especificado correctamente. La razón típica de este error es que los orígenes no están en el directorio raíz del repositorio Git, sino en un directorio hijo.
  • No se admiten paquetes de compilación para crear los orígenes.
429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. Dockerfile -Se ha alcanzado el límite de velocidad de extracción de Dockerfile.
Cualquier otro mensaje de error Dockerfile, Buildpacks
  • Hay un problema con la compilación de Docker.
  • Hay un problema con el código fuente.

Pruebe una de estas soluciones.

Tanto si ejecuta la compilación en la consola como en la CLI, utilice la CLI para resolver problemas con la compilación.

  1. Ejecute el comando ibmcloud ce buildrun get --name BUILDRUN_NAME para visualizar los detalles de la ejecución de la compilación.
  2. Revise Reason en la salida del mandato.

Después de comprobar los registros e identificar las posibles causas raíz, emprenda las siguientes acciones de resolución que le ayuden a resolver el problema.

Resolución en el caso de límite de memoria durante la compilación

Consulte La compilación falla cuando se supera el límite de memoria para obtener información de resolución.

Resolución en el caso de un problema de registro de contenedores durante la compilación

En este escenario, el secreto de registro para acceder al registro de su contenedor no existe o el secreto no es correcto.

  1. Determine el secreto que se utiliza. Utilice el comando ibmcloud ce build get para mostrar el secreto de registro que se utiliza.

  2. Determine si existe una clave .dockerconfigjson. Utilice el mandato ibmcloud ce secret get para el secreto de registro. Tenga en cuenta que los datos secretos están codificados con base64 y no son visibles directamente; no obstante, el secreto contiene las credenciales. En la salida del mandato, compruebe la sección Data. Debe contener una clave denominada .dockerconfigjson. Si no se visualiza la clave .dockerconfigjson, significa que este secreto no es adecuado para autenticarse con un registro de contenedores y debe crear un secreto correcto y hacer referencia al mismo en la compilación. Para obtener más información, consulte el tema sobre Adición de acceso a un registro de contenedores privado.

    Salida de ejemplo

    $ ibmcloud code-engine secret get -n <REGISTRY_SECRET>
    Getting secret <REGISTRY_SECRET>...
    OK
    
    Name:        <REGISTRY_SECRET>
    ID:          <REGISTRY_SECRET_ID>
    Project:     <PROJECT_NAME>
    Project ID:  <PROJECT_NAMESPACE>
    Age:         8s
    Created:     2021-02-12T10:26:59-06:00
    
    Data:
    ---
    .dockerconfigjson: <BASE64_STRING>
    
  3. Si la clave .dockerconfigjson existe, descodifique la clave, que es una serie codificada en base64, con el mandato siguiente,

    echo "<BASE64_STRING>" | base64 -d
    {"auths":{"<REGISTRY>":{"username":"<USERNAME>","password":"<PASSWORD>","auth":"<AUTH>"}}}
    

    La salida de este mandato normalmente contiene una clave <REGISTRY>.

  4. Confirme la siguiente información sobre la clave:

    a. Examine el valor de <REGISTRY>. Este valor debe coincidir con la imagen de la compilación.

    • Si el nombre de la imagen está en IBM Cloud Container Registry, por ejemplo us.icr.io/aNamespace/anImage, entonces <REGISTRY> debe ser us.icr.io.

    • Si el nombre de la imagen es docker.io/aNamespace/aRepository o /aNamespace/aRepository sin ningún nombre de host, entonces la compilación utiliza Docker Hub. En este caso, el <REGISTRY> debe ser https://index.docker.io/v1/.

    b. Examine el valor de <USERNAME>. Si el registro es IBM Cloud Container Registry, se debe utilizar una clave de API para la autenticación. El <USERNAME> debe ser iamapikey y la contraseña debe ser una clave de API. Consulte Automatización del acceso a IBM Cloud Container Registry para ver los pasos necesarios para crear la clave de API.

    c. Es necesario validar las credenciales. IBM Cloud® Identity and Access Management (IAM) permite asignar permisos de forma precisa. Por ejemplo, es posible que un ID de servicio con acceso a un espacio de nombres de IBM Cloud Container Registry y permiso para extraer imágenes no tenga permiso para enviar imágenes. Pero en este caso este es el permiso que se necesita.

  5. Después de determinar los cambios necesarios, cree un secreto de registro de contenedores que utilice valores corregidos. Utilice el mandato ibmcloud ce secret create --format ; por ejemplo,

    ibmcloud ce secret create --format registry --name <REGISTRY_SECRET> --server <REGISTRY_SERVER> --username <USERNAME> --password <PASSWORD>
    
  6. Actualice la compilación para que haga referencia al nombre del secreto de registro.

    a. Utilice el mandato ibmcloud ce build update para actualizar la configuración de compilación para que utilice el nombre del secreto de registro; por ejemplo,

    ibmcloud ce build update --name <BUILD_NAME> --registry-secret <REGISTRY_SECRET>
    

    b. Utilice el mandato ibmcloud ce buildrun submit para enviar una nueva ejecución de compilación. Para el mandato buildrun submit, debe especificar la opción --build para proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción --name para proporcionar el nombre de esta ejecución de compilación. Si especifica la opción --name, asegúrese de utilizar un nombre de ejecución de compilación distinto del de la ejecución errónea o asegúrese de suprimir la ejecución de compilación errónea con el mandato ibmcloud ce buildrun delete. Por ejemplo:

    ibmcloud ce buildrun submit --build <BUILD_NAME> --name <BUILDRUN_NAME>
    

Resolución en el caso de que no se encuentre Dockerfile durante la compilación

Una compilación de Docker necesita un Dockerfile que especifique cómo se va a crear la imagen del contenedor. Si el repositorio de origen no contiene dicho archivo, debe proporcionar este archivo o considerar el uso de paquetes de compilación como estrategia de compilación. Para obtener más información, consulte Planificación de una compilación.

  1. Si el Dockerfile existe pero tiene un nombre distinto o no está en el directorio raíz, es necesario especificar valores adicionales en la compilación.

    • Si el Dockerfile no se encuentra en el directorio raíz del repositorio de origen, debe especificar el argumento --context-dir y proporcionar la vía de acceso al directorio que contiene el Dockerfile.
    • Si el Dockerfile no se llama Dockerfile, debe especificar el argumento --dockerfile y proporcionar el nombre del Dockerfile.
  2. Actualice la compilación para que utilice las opciones --context-dir o --dockerfile según sea necesario.

    a. Utilice el mandato ibmcloud ce build update para actualizar la configuración de la compilación para que utilice las opciones --context-dir o --dockerfile según sea necesario; por ejemplo,

    ibmcloud ce build update --name <BUILD_NAME> [--context-dir <CONTEXT_DIR>] [--dockerfile <DOCKERFILE_NAME>]
    

    b. Utilice el mandato ibmcloud ce buildrun submit para enviar una nueva ejecución de compilación. Para el mandato buildrun submit, debe especificar la opción --build para proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción --name para proporcionar el nombre de esta ejecución de compilación. Si especifica la opción --name, asegúrese de utilizar un nombre de ejecución de compilación distinto del de la ejecución errónea o asegúrese de suprimir la ejecución de compilación errónea con el mandato ibmcloud ce buildrun delete. Por ejemplo:

    ibmcloud ce buildrun submit --build <BUILD_NAME> --name <BUILDRUN_NAME>
    

La resolución para el límite de cuota de IBM Cloud Container Registry se alcanza durante la compilación

IBM Cloud Container Registry tiene dos planes de servicio, un plan gratuito y un plan estándar. Para el plan gratuito, IBM Cloud Container Registry aplica límites estrictos, especialmente en el tamaño de imágenes que se pueden almacenar en total (500 MB). Para el plan estándar, puede configurar las cuotas. Para obtener más información, consulte Acerca de IBM Cloud Container Registry.

  1. Realice una de las acciones siguientes:

    • Suprima las imágenes que no utilice del espacio de nombres de IBM Cloud Container Registry para aumentar el espacio disponible.
    • Actualice del plan gratuito al plan estándar.
    • Aumente las cuotas del espacio de nombres de IBM Cloud Container Registry.

    El URL de la imagen se incluye en el mensaje de error para ayudarle a identificar el espacio de nombres de IBM Cloud Container Registry que se ve afectado. El espacio de nombres puede estar en una cuenta de IBM Cloud distinta de la del proyecto de IBM Cloud Code Engine.

  2. Después de completar las acciones correctivas, utilice el mandato ibmcloud ce buildrun submit para enviar una nueva ejecución de compilación. Para el mandato buildrun submit, debe especificar la opción --build para proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción --name para proporcionar el nombre de esta ejecución de compilación. Si especifica la opción --name, asegúrese de utilizar un nombre de ejecución de compilación distinto del de la ejecución errónea o asegúrese de suprimir la ejecución de compilación errónea con el mandato ibmcloud ce buildrun delete. Por ejemplo:

    ibmcloud ce buildrun submit --build <BUILD_NAME> --name <BUILDRUN_NAME>
    

Resolución en el caso de que no se haya especificado correctamente el origen de la compilación

La razón típica por la que se produce este error es que el origen de compilación no se encuentra en el directorio raíz del repositorio Git, sino en un directorio hijo. Si el origen de compilación no reside en el directorio raíz, especifique la ubicación en la compilación.

  1. Utilice el mandato ibmcloud ce build update para actualizar la configuración de compilación para que utilice la opción --context-dir para especificar la vía de acceso al origen en el repositorio Git; por ejemplo,

    ibmcloud ce build update --name <BUILD_NAME> --context-dir <CONTEXT_DIR>
    
  2. Utilice el mandato ibmcloud ce buildrun submit para enviar una nueva ejecución de compilación. Para el mandato buildrun submit, debe especificar la opción --build para proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción --name para proporcionar el nombre de esta ejecución de compilación. Si especifica la opción --name, asegúrese de utilizar un nombre de ejecución de compilación distinto del de la ejecución errónea o asegúrese de suprimir la ejecución de compilación errónea con el mandato ibmcloud ce buildrun delete. Por ejemplo:

    ibmcloud ce buildrun submit --build <BUILD_NAME> --name <BUILDRUN_NAME>
    

Resolución de un problema debido a los límites de velocidad de Docker Hub

Cuando extraiga una imagen de Docker Hub para utilizarla con aplicaciones o trabajos en Code Engine, tenga en cuenta los límites de tarifa de Docker para los usuarios del plan gratuito (no autenticados). Es posible que detecte limitaciones de extracción si recibe un error 429 que le indica que ha alcanzado el límite de velocidad de extracción. Si recibe este error, intente una de las soluciones siguientes.

  • Aumente los límites de velocidad. Puede autenticarse con Docker Hub, o actualizar su cuenta a una suscripción de Docker Pro o Team, si es necesario.

  • Extraiga la imagen compilada de Docker Hub y publique la imagen en un registro diferente, como por ejemplo IBM Cloud® Container Registry. A continuación, extraiga la imagen de la nueva ubicación. Code Engine da soporte a la referencia a un único secreto. Si la imagen base para la compilación de Dockerfile se extrae de un registro distinto al de donde se publica la imagen compilada resultante y ambos registros requieren autenticación, puede utilizar kubectl para crear un secreto de Kubernetes de tipo kubernetes.io/dockerconfigjson que contenga credenciales para ambos registros. Para obtener información sobre cómo trabajar con credenciales de acceso para ambos registros, consulte la documentación de Kubernetes sobre cómo extraer una imagen de un repositorio privado.

Resolución en el caso de que el origen de compilación no reciba soporte de los paquetes de compilación

Para comprobar si el repositorio de origen de compilación recibe soporte en Code Engine, consulte Elección de una estrategia de compilación para ver los tiempos de ejecución soportados. Si el lenguaje aparece en la lista, consulte los ejemplos enlazados y asegúrese de estructurar correctamente los orígenes para que los paquetes de compilación puedan detectarlos y crearlos correctamente. Si no puede hallar ningún paquete de compilación adecuado para el origen o la forma estandarizada en que los paquetes de compilación ejecutan la compilación no satisface sus necesidades, puede especificar un Dockerfile, describir el contenedor de la compilación manualmente en el Dockerfile y luego utilizar la estrategia de compilación dockerfile en la configuración de compilación.

Resolución para un problema con la compilación de Docker

Si el problema del error del paso de compilación y envío no es un problema con la memoria, un secreto de registro de contenedores o un Dockerfile, es probable que el problema esté en la compilación de Docker. El problema puede ser un error en el propio Dockerfile, por ejemplo, un error de sintaxis o un error en la corrección de la operación que realiza. El problema también puede estar en el código fuente, que puede dar un error al compilar, por ejemplo, si incluye código Java®.

Si la compilación del proyecto local es correcta pero el mismo código fuente no se compila en Code Engine, es posible que tenga archivos disponibles localmente que no estén en el repositorio Git. Por ejemplo, para los proyectos Node.js, es habitual ejecutar el mandato npm install localmente para que las dependencias del proyecto se descarguen y se coloquen en el directorio node_modules dentro del directorio del proyecto. Es una buena práctica incluir el directorio node_modules en el archivo.gitignore para mantener su repositorio Git pequeño. Un error común es olvidar ejecutar también npm install (o npm ci) en el Dockerfile. Una compilación de Docker que ejecute localmente puede acceder al directorio local node_modules, si copia todo el proyecto en el contenedor, por ejemplo, utilizando el comando COPY . /app en el Dockerfile. Pero la compilación de Code Engine se ejecuta desde un repositorio Git que se acaba de extraer y no se puede acceder al directorio node_modules. Por lo tanto, debe ejecutar npm install (o npm ci) en el Dockerfile como parte de la compilación.

Una buena práctica es incluir directorios como node_modules también en un archivo.dockerignore para que la compilación Docker que ejecute localmente se comporte igual que la compilación Code Engine.

Otra razón para que un proyecto se cree con éxito a nivel local pero falle como compilación de Code Engine son las limitaciones de seguridad. Al igual que sucede con las aplicaciones y los trabajos por lotes, Code Engine no permite operaciones arbitrarias del sistema dentro del clúster de Code Engine. La mayoría de estas operaciones del sistema no son relevantes para las compilaciones de Docker. Sin embargo, Code Engine no permite abrir sockets de servidor para puertos con privilegios. El rango es 0 to 1023. Por ejemplo, si compila una aplicación web y la compilación incluye un paso de prueba que activa un servidor de aplicaciones web, debe utilizar puertos con números más altos para este servidor.