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.

Note

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

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

  1. 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"]
  2. 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
  3. 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

  1. Définissez un objet BuildConfig qui construira votre image de constructeur personnalisée :

    $ oc new-build --binary --strategy=docker --name custom-builder-image
  2. 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

  1. Créez un fichier nommé buildconfig.yaml. Ce fichier définit l'objet BuildConfig 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.
  2. Créer le site BuildConfig:

    $ oc create -f buildconfig.yaml
  3. 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: {}
  4. Créer le flux d'images :

    $ oc create -f imagestream.yaml
  5. 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 logique build.sh invoque Buildah pour construire le site dockerfile.sample qui a été intégré dans l'image de construction personnalisée, puis utilise Buildah pour pousser la nouvelle image vers le site sample-custom image stream.