Skip to content

Creer une image pour un pod

Les applications du catalogue font référence à des images du registre ou fabriquent les images pour leurs pod. Il peut parfois être nécessaire de fabriquer une image particulière. Un exemple est d'ajouter une extension PHP à une application LAMP.

Prenons un projet plm-limesurvey basé sur l'application LAMP (accessible via le catalogue de PLMShift). Cette application est composée d'un pod DB avec un service mySQL et d'un pod WEB avec PHP et la source du site.

  • Le pod DB utilise directement une image du registre openshift/mysql.
  • Le pod WEB va construire une image plm-limesurvey/lamp à partir de l'image du registre openshift/php:7.2.

C'est cette image de base que nous voulons substituer par une image basée sur l'image openshift/php:7.2 et contenant en plus l'extensionPHP IMAP. Un Dockerfile décrit la construction de l'image souhaitée.

En ligne de commande

Création d'une image augmentée par un DockerFile

Nous allons commencer par créer un Buildconfig qui produira une image augmentée du package php-imap. Cette image s'appellera limesurvey-builder

cat > /tmp/dockerfile << 'EOF'
FROM centos/php-72-centos7

# On passe en root pour utiliser yum
USER 0

RUN yum install -y epel-release && yum update -y && yum install -y --setopt=tsflags=nodocs libc-client rh-php72-php-imap && yum -y clean all --enablerepo='*'

RUN rm -rf /tmp/sessions  && /usr/libexec/container-setup && rpm-file-permissions

# Openshift n'accepte que des images avec un USER non root (par convention : 1001)
# On revient donc à USER 1001. Les paramètres ENTRYPOINT et CMD sont ceux de l'image de base
USER 1001
EOF
cat /tmp/dockerfile | oc new-build --name limesurvey-builder --image php:7.2 --dockerfile=-

Remarque : le DockerFile doit nécessairement commencer par un FROM et le nom d'une image Docker. En revanche, ce sera le paramètre --image php:7.2 qui sera pris en compte (c'est à dire l'image interne de openshift/php:7.2) pour fabriquer cette image. Le champ FROM est donc ignoré lors de la constructio nde l'image.

Déploiement de l'application LAMP

Ensuite, nous pouvons déployer un projet LAMP du catalogue basé sur le dépôt GitHUB de LimeSurvey. Le processus va détecter automatiquement le fichier composer.json et va donc déployer LimeSurvey en se basant sur ce dernier :

oc new-app lamp~https://github.com/LimeSurvey/LimeSurvey.git --name limesurvey

Modification de l'image du Pod WEB

Et enfin, nous modifions l'image de référence permettant de fabriquer le POD WEB. Pour cela nous remplaçons le nom de l'image php:7.2 du template de base par limesurvey-builder:latest et nous supprimons le nom du namespace où chercher cette image car limesurvey-builder est dans le projet courant :

oc patch bc/limesurvey -p='[{"op": "replace", "path": "/spec/strategy/sourceStrategy/from/name", "value":"limesurvey-builder:latest" },{"op": "remove", "path": "/spec/strategy/sourceStrategy/from/namespace"}]' --type json

Par l'interface web

Création d'un ImageStream plm-limesurvey/limesurvey qui référencera le dernier Build du même nom.

ClusterConsole/Project:plm-limesurvey // Builds/ImageStreams // CreateImageStream

https://console.apps.math.cnrs.fr/k8s/ns/plm-limesurvey/imagestreams/new

apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
  name: limesurvey
  namespace: plm-limesurvey

Création du Build plm-limesurvey/limesurvey. Elle se fait à partir d'une image openshift/php:7.2. Elle est personalisée par un Dockerfile directement décrit dans sa configuration. Ceci est utilisable pour de petites modifications. Sinon il est conseillé de définir un dépôt GIT comme source du Dockerfile. Un exemple est proposé sur l'interface de création du Build.

ClusterConsole/Project plm-limesurvey // Builds/BuildConfigs // CreateBuildConfig

https://console.apps.math.cnrs.fr/k8s/ns/try-limsur/buildconfigs/new

apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  name: limesurvey
  namespace: plm-limesurvey
spec:
  output:
    to:
      kind: ImageStreamTag
      name: 'limesurvey:latest'
  strategy:
    type: Docker
    dockerStrategy:
      from:
        kind: ImageStreamTag
        namespace: openshift
        name: 'php:7.2'
  postCommit: {}
  source:
    type: Dockerfile
    dockerfile: >+
      FROM centos/php-72-centos7

      USER 0

      RUN yum install -y epel-release && yum update -y && yum install -y
      --setopt=tsflags=nodocs libc-client rh-php72-php-imap && yum -y clean all
      --enablerepo='*'

      RUN rm -rf /tmp/sessions  && /usr/libexec/container-setup &&
      rpm-file-permissions

      USER 1001

  triggers:
    - type: ImageChange
      imageChange: {}
    - type: ConfigChange
    - type: GitHub
      github:
        secret: secret101

Il est possible de suivre la progression du build avec l'onglet Logs.

https://console.apps.math.cnrs.fr/k8s/ns/plm-limesurvey/builds/limesurvey-1/logs

ou dans ApplicationConsole

https://plmshift.math.cnrs.fr/console/project/plm-limesurvey/browse/builds/limesurvey/limesurvey-1?tab=logs

Si le Build se termine correctement, l'ImageStream pointera sur la nouvelle image construite.

Ajout d'une application "LAMP (with Repository)" au projet. Le déploiement du pod DB aboutit rapidement. Le build du pod WEB est inutile puisque l'on souhaite utiliser notre image comme brique de base.

ApplicationConsole/Project: plm-limesurvey // Builds/Builds/limsur // Actions/Edit

https://plmshift.math.cnrs.fr/console/project/try-limsur/edit/builds/limsur

Image Configuration
Build From
ImageStreamTag
plm-limesurvey / limesurvey : latest

Normalement un nouveau Build se lance, sinon bouton "Start Build".