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 paquetemvn -Dmaven.test.skip=true. Si se encuentra un archivopackage.json, se presupone que la compilación es para una aplicación Node.js y se ejecutanpm 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-pushPara 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.
| El mensaje de error contiene | Estrategia | Causas raíz potenciales |
|---|---|---|
Killed |
Dockerfile, Buildpacks |
|
error checking pushed permissions
|
Dockerfile
Paquetes de compilación Paquetes de compilación |
|
error: failed to solve: failed to read dockerfile: open /tmp/buildkit-mount306846082/Dockerfile: no such file or directory |
Dockerfile |
|
error: failed to solve: unexpected status: 403 ForbiddenDENIED: 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 |
|
ERROR: No buildpack groups passed detection. |
Paquetes de compilación |
|
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 |
|
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.
- Ejecute el comando
ibmcloud ce buildrun get --name BUILDRUN_NAMEpara visualizar los detalles de la ejecución de la compilación. - Revise
Reasonen 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.
-
Determine el secreto que se utiliza. Utilice el comando
ibmcloud ce build getpara mostrar el secreto de registro que se utiliza. -
Determine si existe una clave
.dockerconfigjson. Utilice el mandatoibmcloud ce secret getpara 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ónData. 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> -
Si la clave
.dockerconfigjsonexiste, 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>. -
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 serus.icr.io. -
Si el nombre de la imagen es
docker.io/aNamespace/aRepositoryo/aNamespace/aRepositorysin ningún nombre de host, entonces la compilación utiliza Docker Hub. En este caso, el<REGISTRY>debe serhttps://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 seriamapikeyy 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.
-
-
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> -
Actualice la compilación para que haga referencia al nombre del secreto de registro.
a. Utilice el mandato
ibmcloud ce build updatepara 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 submitpara enviar una nueva ejecución de compilación. Para el mandatobuildrun submit, debe especificar la opción--buildpara proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción--namepara 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 mandatoibmcloud 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.
-
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-diry proporcionar la vía de acceso al directorio que contiene el Dockerfile. - Si el Dockerfile no se llama
Dockerfile, debe especificar el argumento--dockerfiley proporcionar el nombre del Dockerfile.
- Si el Dockerfile no se encuentra en el directorio raíz del repositorio de origen, debe especificar el argumento
-
Actualice la compilación para que utilice las opciones
--context-diro--dockerfilesegún sea necesario.a. Utilice el mandato
ibmcloud ce build updatepara actualizar la configuración de la compilación para que utilice las opciones--context-diro--dockerfilesegú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 submitpara enviar una nueva ejecución de compilación. Para el mandatobuildrun submit, debe especificar la opción--buildpara proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción--namepara 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 mandatoibmcloud 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.
-
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.
-
Después de completar las acciones correctivas, utilice el mandato
ibmcloud ce buildrun submitpara enviar una nueva ejecución de compilación. Para el mandatobuildrun submit, debe especificar la opción--buildpara proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción--namepara 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 mandatoibmcloud 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.
-
Utilice el mandato
ibmcloud ce build updatepara actualizar la configuración de compilación para que utilice la opción--context-dirpara 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> -
Utilice el mandato
ibmcloud ce buildrun submitpara enviar una nueva ejecución de compilación. Para el mandatobuildrun submit, debe especificar la opción--buildpara proporcionar el nombre de la configuración de compilación. Opcionalmente, puede especificar la opción--namepara 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 mandatoibmcloud 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
ProoTeam, 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
kubectlpara crear un secreto de Kubernetes de tipokubernetes.io/dockerconfigjsonque 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.