2.6. Constructions d'images personnalisées avec Buildah
Avec OpenShift Container Platform 4.12, un docker socket ne sera pas présent sur les nœuds hôtes. Cela signifie que l'option mount docker socket d'une construction personnalisée n'est pas garantie pour fournir un socket docker accessible pour une utilisation dans une image de construction personnalisée.
Si vous avez besoin de cette capacité pour construire et pousser des images, ajoutez l'outil Buildah à votre image de construction personnalisée et utilisez-le pour construire et pousser l'image dans votre logique de construction personnalisée. Voici un exemple d'exécution de constructions personnalisées à l'aide de Buildah.
L'utilisation de la stratégie de construction personnalisée nécessite des autorisations que les utilisateurs normaux n'ont pas par défaut, car elle permet à l'utilisateur d'exécuter du code arbitraire à l'intérieur d'un conteneur privilégié fonctionnant sur le cluster. Ce niveau d'accès peut être utilisé pour compromettre le cluster et ne doit donc être accordé qu'à des utilisateurs disposant de privilèges administratifs sur le cluster.
2.6.1. Conditions préalables
- Examiner comment accorder des autorisations de construction personnalisée.
2.6.2. Création d'artefacts de construction personnalisés
Vous devez créer l'image que vous souhaitez utiliser comme image de construction personnalisée.
Procédure
En partant d'un répertoire vide, créez un fichier nommé
Dockerfile
avec le contenu suivant :FROM registry.redhat.io/rhel8/buildah # In this example, `/tmp/build` contains the inputs that build when this # custom builder image is run. Normally the custom builder image fetches # this content from some location at build time, by using git clone as an example. ADD dockerfile.sample /tmp/input/Dockerfile ADD build.sh /usr/bin RUN chmod a+x /usr/bin/build.sh # /usr/bin/build.sh contains the actual custom build logic that will be run when # this custom builder image is run. ENTRYPOINT ["/usr/bin/build.sh"]
Dans le même répertoire, créez un fichier nommé
dockerfile.sample
. Ce fichier est inclus dans l'image de construction personnalisée et définit l'image produite par la construction personnalisée :FROM registry.access.redhat.com/ubi8/ubi RUN touch /tmp/build
Dans le même répertoire, créez un fichier nommé
build.sh
. Ce fichier contient la logique qui est exécutée lors de l'exécution de la version personnalisée :#!/bin/sh # Note that in this case the build inputs are part of the custom builder image, but normally this # is retrieved from an external source. cd /tmp/input # OUTPUT_REGISTRY and OUTPUT_IMAGE are env variables provided by the custom # build framework TAG="${OUTPUT_REGISTRY}/${OUTPUT_IMAGE}" # performs the build of the new image defined by dockerfile.sample buildah --storage-driver vfs bud --isolation chroot -t ${TAG} . # buildah requires a slight modification to the push secret provided by the service # account to use it for pushing the image cp /var/run/secrets/openshift.io/push/.dockercfg /tmp (echo "{ \"auths\": " ; cat /var/run/secrets/openshift.io/push/.dockercfg ; echo "}") > /tmp/.dockercfg # push the new image to the target for the build buildah --storage-driver vfs push --tls-verify=false --authfile /tmp/.dockercfg ${TAG}
2.6.3. Construire une image personnalisée du constructeur
Vous pouvez utiliser OpenShift Container Platform pour construire et pousser des images de constructeur personnalisées à utiliser dans une stratégie personnalisée.
Conditions préalables
- Définissez toutes les données qui seront utilisées pour créer votre nouvelle image de constructeur personnalisé.
Procédure
Définissez un objet
BuildConfig
qui construira votre image de constructeur personnalisée :$ oc new-build --binary --strategy=docker --name custom-builder-image
Depuis le répertoire dans lequel vous avez créé votre image de compilation personnalisée, exécutez la compilation :
$ oc start-build custom-builder-image --from-dir . -F
Une fois la construction terminée, votre nouvelle image de constructeur personnalisé est disponible dans votre projet dans une balise de flux d'images nommée
custom-builder-image:latest
.
2.6.4. Utiliser l'image personnalisée du constructeur
Vous pouvez définir un objet BuildConfig
qui utilise la stratégie personnalisée en conjonction avec votre image de constructeur personnalisé pour exécuter votre logique de construction personnalisée.
Conditions préalables
- Définir toutes les entrées requises pour la nouvelle image du constructeur personnalisé.
- Créez votre image de constructeur personnalisée.
Procédure
Créez un fichier nommé
buildconfig.yaml
. Ce fichier définit l'objetBuildConfig
qui est créé dans votre projet et exécuté :kind: BuildConfig apiVersion: build.openshift.io/v1 metadata: name: sample-custom-build labels: name: sample-custom-build annotations: template.alpha.openshift.io/wait-for-ready: 'true' spec: strategy: type: Custom customStrategy: forcePull: true from: kind: ImageStreamTag name: custom-builder-image:latest namespace: <yourproject> 1 output: to: kind: ImageStreamTag name: sample-custom:latest
- 1
- Indiquez le nom de votre projet.
Créer le site
BuildConfig
:$ oc create -f buildconfig.yaml
Créez un fichier nommé
imagestream.yaml
. Ce fichier définit le flux d'images vers lequel la compilation poussera l'image :kind: ImageStream apiVersion: image.openshift.io/v1 metadata: name: sample-custom spec: {}
Créer le flux d'images :
$ oc create -f imagestream.yaml
Exécutez votre construction personnalisée :
$ oc start-build sample-custom-build -F
Lorsque la construction s'exécute, elle lance un pod qui exécute l'image du constructeur personnalisé qui a été construite précédemment. Le pod exécute la logique
build.sh
qui est définie comme le point d'entrée de l'image du constructeur personnalisé. La logiquebuild.sh
invoque Buildah pour construire le sitedockerfile.sample
qui a été intégré dans l'image de construction personnalisée, puis utilise Buildah pour pousser la nouvelle image vers le sitesample-custom image stream
.