La génération échoue dans l'étape de génération et d'envoi

Une fois que vous avez créé et exécuté une génération, votre génération n'aboutit pas et vous recevez un message indiquant que la génération échoue dans l'étape de génération et d'envoi.

L'étape de génération et d'envoi est l'étape principale d'une génération Code Engine.

  • Si vous avez choisi la stratégie de génération de fichier Dockerfile, BuildKit analyse le fichier Dockerfile et effectue les étapes qu'il décrit pour créer une image de conteneur avant de l'envoyer.

  • Si vous avez choisi la stratégie de génération des packs de construction, vérifiez les fichiers dans le répertoire source pour déterminer le type de génération demandé. Par exemple, si le répertoire source contient un fichier pom.xml, les packs de construction supposent un type Maven et exécutent une génération de pack mvn -Dmaven.test.skip=true. S'ils trouvent un fichier package.json, ils supposent que la génération concerne une application Node.js et exécutent npm install. Le résultat est conditionné dans une image avec l'environnement d'exécution requis et envoyé au registre de conteneur.

    Exemple de message d'erreur

    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
    

    Pour déterminer la cause première, consultez le journal de l'étape. Exécutez la commande ibmcloud ce buildrun logs. Concentrez-vous sur les journaux de l'étape ayant échoué :

    ibmcloud ce buildrun logs -n <BUILDRUN_NAME>
    

Le tableau ci-après décrit le texte d'erreur et les causes premières potentielles pour ce scénario.

Texte d'erreur et causes premières pour les étapes de génération et d'envoi
Message d'erreur Stratégie Causes premières potentielles
Killed Dockerfile, Buildpacks
  • La limite de mémoire est atteinte.
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

Buildpacks

Buildpacks

-Le secret du registre de conteneur n'est pas défini.
-Le secret du registre du conteneur n'est pas du type correct.
-Le secret du registre de conteneur n'est pas pour le registre de conteneur correct.
-Le secret du registre de conteneur ne permet pas de pousser vers le registre de conteneur.
error: failed to solve: failed to read dockerfile: open /tmp/buildkit-mount306846082/Dockerfile: no such file or directory Fichier Docker -Le fichier Dockerfile ne se trouve pas dans le répertoire racine du référentiel source.
-Le référentiel source ne contient pas de fichier 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
  • IBM Cloud® Container Registry est utilisé et une limite de quota est atteinte.
ERROR: No buildpack groups passed detection. Buildpacks
  • La source de la génération n'a pas été spécifiée correctement. Cette erreur s'explique généralement par le fait que les sources ne se trouvent pas dans le répertoire racine du référentiel Git , mais dans un répertoire enfant.
  • Buildpacks n'est pas pris en charge pour générer les sources.
429 Too Many Requests - Server message: toomanyrequests: You have reached your pull rate limit. Fichier Docker -La limite de débit d'extraction du fichier Dockerfile est atteinte.
Tout autre message Dockerfile, Buildpacks
  • Il y a un problème avec la génération Docker.
  • Il y a un problème avec le code source.

Essayez l'une des solutions ci-après.

Que vous exécutiez votre génération depuis la console ou depuis l'interface de ligne de commande, utilisez l'interface de ligne de commande pour traiter les problèmes liés à votre génération.

  1. Exécutez la commande ibmcloud ce buildrun get --name BUILDRUN_NAME pour afficher les détails de votre exécution de génération.
  2. Consultez la section Reason dans la sortie de la commande.

Une fois que vous avez consulté les journaux et identifié les causes premières potentielles, utilisez les actions de résolution ci-dessous pour résoudre le problème.

Résolution d'un problème de limite de mémoire lors de la génération

Voir La génération échoue lorsque la limite de mémoire est dépassée pour des informations relatives à la résolution.

Résolution d'un problème de registre de conteneur lors de la génération

Dans ce scénario, un secret de registre permettant d'accéder au registre de votre conteneur n'existe pas ou le secret n'est pas correct.

  1. Déterminez le secret utilisé. Utilisez la commande ibmcloud ce build get pour afficher le secret de registre utilisé.

  2. Déterminez si une clé .dockerconfigjson existe. Utilisez la commande ibmcloud ce secret get pour le secret de registre. Notez que les données du secret sont codées en base64 et ne sont pas directement visibles ; toutefois, le secret contient des données d'identification. Dans la sortie de la commande, vérifiez la section Data. Elle doit contenir une clé appelée .dockerconfigjson. Si la clé .dockerconfigjson ne figure pas dans la section, ce secret ne convient pas pour l'authentification auprès d'un registre de conteneur et vous devez créer un secret correct et y faire référence dans la génération. Pour plus d'informations, voir Ajout d'un accès à un registre de conteneur privé.

    Exemple de sortie

    $ 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 clé .dockerconfigjson existe, décodez cette chaîne codée en base64 en utilisant la commande suivante :

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

    La sortie de cette commande contient généralement une clé <REGISTRY>.

  4. Vérifiez les informations suivantes au sujet de la clé :

    a. Examinez la valeur <REGISTRY>. Cette valeur doit correspondre à l'image de la génération.

    • Si le nom de l'image est sous IBM Cloud Container Registry, par exemple us.icr.io/aNamespace/anImage, <REGISTRY> doit être us.icr.io.

    • Si le nom de l'image est docker.io/aNamespace/aRepository ou /aNamespace/aRepository sans nom d'hôte, la génération utilise alors Docker Hub. Dans ce cas, <REGISTRY> doit être https://index.docker.io/v1/.

    b. Examinez la valeur <USERNAME>. Si le registre est un IBM Cloud Container Registry, la clé d'API doit être utilisée pour l'authentification. Le <USERNAME> doit être iamapikey et le mot de passe doit être une clé d'API. Pour connaître les étapes de création de la clé d'API, voir Automatisation de l'accès à IBM Cloud Container Registry.

    c. Les données d'identification doivent être validées. IBM Cloud® Identity and Access Management (IAM) permet d'affecter des droits d'accès de manière précise. Par exemple, un ID de service avec accès à un espace de nom IBM Cloud Container Registry et les droits d'extraction d'images, peut ne pas être autorisé à envoyer des images. Or, ces droits sont requis dans ce cas.

  5. Après avoir déterminé les modifications requises, créez un secret de registre de conteneur qui utilise les valeurs corrigées. Utilisez la commande ibmcloud ce secret create --format ; par exemple,

    ibmcloud ce secret create --format registry --name <REGISTRY_SECRET> --server <REGISTRY_SERVER> --username <USERNAME> --password <PASSWORD>
    
  6. Mettez à jour la génération pour faire référence au nom de votre secret de registre.

    a. Utilisez la commande ibmcloud ce build update pour mettre à jour la configuration de génération afin d'utiliser le nom de votre secret de registre ; par exemple

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

    b. Utilisez la commande ibmcloud ce buildrun submit pour soumettre une nouvelle exécution de génération. Pour la commande buildrun submit, vous devez spécifier l'option --build pour fournir le nom de votre configuration de génération. Vous pouvez éventuellement spécifier l'option --name pour fournir le nom de cette exécution de génération. Si vous spécifiez l'option --name, veillez à utiliser un autre nom d'exécution de génération que celui de l'exécution de génération ayant échoué, ou à supprimer l'exécution de génération ayant échoué à l'aide de la commande ibmcloud ce buildrun delete. Par exemple :

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

Résolution d'un problème de fichier Dockerfile introuvable lors de la génération

Une génération de fichier Docker a besoin d'un fichier Dockerfile qui spécifie de quelle façon l'image de conteneur doit être générée. Si le référentiel source ne contient pas un tel fichier, vous devez le fournir ou envisager d'utiliser des packs de construction comme stratégie de génération. Pour plus d'informations, voir Planification de votre génération.

  1. Si le fichier Dockerfile existe mais avec un nom différent ou s'il ne figure pas dans le répertoire racine, d'autres paramètres doivent être spécifiés dans la génération.

    • Si le fichier Dockerfile ne figure pas dans le répertoire racine du référentiel source, vous devez spécifier l'argument --context-dir et fournir le chemin d'accès au répertoire contenant le fichier Dockerfile.
    • Si le fichier Dockerfile porte un nom autre que Dockerfile, vous devez spécifier l'argument --dockerfile et fournir le nom de votre fichier Dockerfile.
  2. Mettez à jour la génération afin d'utiliser les options --context-dir ou --dockerfile selon les besoins.

    a. Utilisez la commande ibmcloud ce build update pour mettre à jour la configuration de génération afin d'utiliser les options --context-dir ou --dockerfile selon vos besoins. Par exemple :

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

    b. Utilisez la commande ibmcloud ce buildrun submit pour soumettre une nouvelle exécution de génération. Pour la commande buildrun submit, vous devez spécifier l'option --build pour fournir le nom de votre configuration de génération. Vous pouvez éventuellement spécifier l'option --name pour fournir le nom de cette exécution de génération. Si vous spécifiez l'option --name, veillez à utiliser un autre nom d'exécution de génération que celui de l'exécution de génération ayant échoué, ou à supprimer l'exécution de génération ayant échoué à l'aide de la commande ibmcloud ce buildrun delete. Par exemple :

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

La résolution de la limite de quota IBM Cloud Container Registry est atteinte lors de la génération

IBM Cloud Container Registry comporte deux plans de service, un plan gratuit et un plan standard. Pour le plan gratuit, IBM Cloud Container Registry applique des limites strictes, en particulier sur la taille d'image totale qui peut être stockée (500 Mo). Pour le plan standard, vous pouvez configurer les quotas. Pour plus d'informations, voir A propos d'IBM Cloud Container Registry.

  1. Exécutez l'une des actions suivantes :

    • Supprimez les images inutilisées de l'espace de nom IBM Cloud Container Registry pour augmenter l'espace disponible.
    • Passez du plan gratuit au plan standard.
    • Augmentez les quotas de l'espace de nom IBM Cloud Container Registry.

    L'URL d'image est incluse dans le message d'erreur pour vous aider à identifier l'espace de nom IBM Cloud Container Registry qui est affecté. L'espace de nom peut se trouver dans un autre compte IBM Cloud que votre projet IBM Cloud Code Engine.

  2. Une fois les actions correctives terminées, utilisez la commande ibmcloud ce buildrun submit pour soumettre une nouvelle exécution de génération. Pour la commande buildrun submit, vous devez spécifier l'option --build pour fournir le nom de votre configuration de génération. Vous pouvez éventuellement spécifier l'option --name pour fournir le nom de cette exécution de génération. Si vous spécifiez l'option --name, veillez à utiliser un autre nom d'exécution de génération que celui de l'exécution de génération ayant échoué, ou à supprimer l'exécution de génération ayant échoué à l'aide de la commande ibmcloud ce buildrun delete. Par exemple :

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

Résolution d'un problème de source de génération incorrecte

Cette erreur se produit généralement si la source de génération ne se trouve pas dans le répertoire racine du référentiel Git, mais dans un répertoire enfant. Si la source de génération ne réside pas dans le répertoire racine, indiquez l'emplacement dans la génération.

  1. Utilisez la commande ibmcloud ce build update pour mettre à jour la configuration de génération afin d'utiliser l'option --context-dir pour spécifier le chemin d'accès à la source dans le référentiel Git. Par exemple :

    ibmcloud ce build update --name <BUILD_NAME> --context-dir <CONTEXT_DIR>
    
  2. Utilisez la commande ibmcloud ce buildrun submit pour soumettre une nouvelle exécution de génération. Pour la commande buildrun submit, vous devez spécifier l'option --build pour fournir le nom de votre configuration de génération. Vous pouvez éventuellement spécifier l'option --name pour fournir le nom de cette exécution de génération. Si vous spécifiez l'option --name, veillez à utiliser un autre nom d'exécution de génération que celui de l'exécution de génération ayant échoué, ou à supprimer l'exécution de génération ayant échoué à l'aide de la commande ibmcloud ce buildrun delete. Par exemple :

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

Résolution d'un problème dû aux limites de débit du concentrateur Docker

Lorsque vous tirez une image de Docker Hub pour l'utiliser avec des applications ou des travaux dans Code Engine, tenez compte des limites de taux de Docker pour les utilisateurs du plan gratuit (non authentifiés). Vous risquez d'être confronté à des limites d'extraction, avec réception d'une erreur 429 indiquant que vous avez atteint votre limite de débit d'extraction. Si vous recevez cette erreur, essayez l'une des solutions suivantes.

  • Augmentation des limites de débit. Vous pouvez vous authentifier avec Docker Hub ou mettre à niveau votre compte vers un abonnement Docker Pro ou Team, si nécessaire.

  • Extrayez l'image générée de Docker Hub et publiez l'image dans un registre différent, tel que IBM Cloud® Container Registry. Ensuite, extrayez votre image du nouvel emplacement. Code Engine prend en charge le référencement d'un secret unique. Si l'image de base de votre génération Dockerfile est extraite d'un registre différent de celui dans lequel l'image générée est publiée et que les deux registres requièrent une authentification, vous pouvez utiliser kubectl pour créer un secret Kubernetes de type kubernetes.io/dockerconfigjson qui contient des données d'identification pour les deux registres. Pour plus d'informations sur l'utilisation des données d'identification d'accès pour les deux registres, voir la documentationKubernetes sur l'extraction d'une image à partir d'un référentiel privé.

Résolution d'un problème de source de génération non prise en charge par les packs de construction

Pour vérifier si votre référentiel source de génération est pris en charge dans Code Engine, voir Choix d'une stratégie de génération pour les environnements d'exécution pris en charge. Si votre langage est répertorié, vérifiez les exemples liés et prenez soin de structurer correctement vos sources afin de permettre aux packs de construction de les détecter et les générer. Si vous ne pouvez pas trouver un pack de construction approprié pour votre source ou que la méthode standardisée d'exécution de la génération par les packs de construction ne répond pas à vos besoins, vous pouvez spécifier un fichier Dockerfile, décrire manuellement la génération du conteneur puis utiliser la stratégie de génération dockerfile dans la configuration de génération.

Résolution d'un problème lié à la génération de fichier Docker

Si l'échec de l'étape de génération et d'envoi n'est pas lié à la mémoire, à un secret de registre de conteneur ou à un fichier Dockerfile, il s'agit probablement d'un problème lié à la génération de fichier Docker. Il peut s'agir d'une erreur dans le fichier Dockerfile lui-même, par exemple, d'une erreur de syntaxe ou de l'exactitude de l'opération qu'il effectue. Le problème peut également se trouver dans votre code source, qui risque de ne pas être compilé, par exemple, si le code Java est inclus.

Si vous avez généré correctement votre projet en local mais que le même code source n'est pas généré dans Code Engine, il est possible que des fichiers disponibles en local ne se trouvent pas dans votre référentiel Git. Par exemple, pour les projets Node.js, il est courant d'exécuter la commande npm install en local pour que les dépendances de projet soient téléchargées et placées dans le répertoire node_modules du répertoire de projet. Il est conseillé d'inclure le répertoire node_modules dans le fichier.gitignore afin de limiter la taille du dépôt Git. Une erreur fréquente est d'oublier d'exécuter en plus la commande npm install (ou npm ci) dans le fichier Dockerfile. Une compilation de Docker que vous exécutez localement peut accéder au répertoire local node_modules, si vous copiez l'ensemble du projet dans le conteneur, par exemple, en utilisant la commande COPY . /app dans le fichier Docker. Toutefois, la génération Code Engine s'exécute à partir d'un référentiel Git qui vient d'être réservé et ne peut pas accéder au répertoire node_modules. Vous devez donc exécuter la commande npm install (ou npm ci) dans le fichier Dockerfile lors de la génération.

Une bonne pratique consiste à inclure des répertoires comme node_modules dans un fichier.dockerignore afin que la version Docker que vous exécutez localement se comporte de la même manière que la version Code Engine.

Les limitations de sécurité constituent une autre cause expliquant que la génération d'un projet aboutisse localement mais échoue dans Code Engine. Comme pour les applications et les travaux par lots, Code Engine ne permet pas les opérations système arbitraires dans le cluster Code Engine. De toute façon, la plupart des opérations système ne sont pas pertinentes pour les générations Docker. Cependant, Code Engine n'autorise pas l'ouverture de sockets de serveur pour les ports privilégiés. La plage est comprise entre 0 to 1023. Par exemple, si vous générez une application Web et que votre génération inclut une étape de test impliquant un serveur d'applications Web, vous devez utiliser des ports avec des numéros plus élevés pour ce serveur.