Journal FusionForge & Docker

7
13
juin
2017

Après quelques efforts d'intégration (les scripts d'autoinstall ont été adaptés/modifiés), il est à présent possible de construire une image docker FusionForge. La communauté a publié les éléments nécessaires pour builder sa propre image. Il n'existe pas encore d'images "officielles" docker, c'est-à-dire publié sur un repository public.
Pour l'instant, l'image docker n'a pas pour vocation d'être utilisée en production. Certaines fonctionnalités nécessitent un intégration forte avec le système d'informations (mailing-lists par exemple) et l'approche utilisée est : "all-in-one" ce qui est un peu contraire à l'idée de docker : "1 service per container". Mais cela permet de faire des tests de validation des fonctionnalités et plugins.
Il est prévu d'activer le plus de fonctionnalités possibles pour donner une meilleure vue sur les capacités de Fusionforge.
La communauté a publié la documentation dans le wiki sur le comment construire son image et l'exécuter.
Bon test! Merci pour vos retours.
Docker Wiki page
Docker Files

  • # Dockerfile

    Posté par . Évalué à 6.

    2 MAINTAINER FusionForge TrivialDev franck.villaume@trivialdev.com

    Deprecated.
    https://docs.docker.com/engine/reference/builder/#maintainer-deprecated

    4 RUN yum -y update; yum clean all
    5 RUN yum -y install git openssh-server; yum clean all

    Il ne faut mettre qu'un RUN pour 'yum update && yum install' et qu'un seul yum install

    33 USER root

    Il faut créer un utilisateur non Root pour lancer le programme.

    • [^] # Re: Dockerfile

      Posté par (page perso) . Évalué à 7.

      Histoire d'aller un peu plus loin, il existe des linter pour Dockerfile.

      Il y a hadolint par exemple.

      Voici ce qu'il donne sur le Dockerfile:

      $ docker run --rm -i sjourdan/hadolint < Dockerfile
      /dev/stdin:6 DL3003 Use WORKDIR to switch to a directory
      /dev/stdin:7 SC1091 Not following: File not included in mock.
      /dev/stdin:7 DL3003 Use WORKDIR to switch to a directory
      /dev/stdin:33 DL3002 Do not switch to root USER
      /dev/stdin:34 DL3020 Use COPY instead of ADD for files and folders
      /dev/stdin:35 DL3020 Use COPY instead of ADD for files and folders
      /dev/stdin:36 DL3020 Use COPY instead of ADD for files and folders
      

      Evidemment chaque item a de la doc correspondante avec des liens vers les documentation docker, par exemple le DL3020.

      Rationale:

      https://docs.docker.com/engine/articles/dockerfile_best-practices/#add-or-copy

      For other items (files, directories) that do not require ADD’s tar auto-extraction capability, you should always use COPY.

      Il y a aussi un linter dans le projet Atomic qui a le mérite d'être assez complet et détaillé:

      $ docker run --rm -it --privileged -v $PWD:/root/ projectatomic/dockerfile-lint dockerfile_lint lint                                                                                                                                                                                                                 
      
      --------ERRORS---------
      
      ERROR: Required LABEL name/key 'Name' is not defined. 
      Reference -> http://docs.projectatomic.io/container-best-practices/#_recommended_labels_for_your_project
      
      
      ERROR: Required LABEL name/key 'Version' is not defined. 
      Reference -> http://docs.projectatomic.io/container-best-practices/#_recommended_labels_for_your_project
      
      
      
      -------WARNINGS--------
      
      Line 5: -> RUN yum -y install git openssh-server; yum clean all
      WARNING: installing SSH in a container is not recommended. Do you really need SSH in this image?. 
      Reference -> https://github.com/jpetazzo/nsenter
      
      
      Line 23: -> RUN cd /opt/sources/fusionforge && source ./autoinstall/common-backports &&     yum install -y make tar &&     backports_rpm &&     yum --enablerepo=epel install -y httpd-itk &&     yum install -y gettext php-cli php-pgsql php-process php-mbstring php-pear-HTTP          httpd mod_dav_svn mod_ssl postgresql-server postgresql-contrib nscd          cvs subversion viewvc python-pycurl git gitweb xinetd          moin mod_wsgi python-psycopg2          unoconv poppler-utils libreoffice-headless          cronie mediawiki &&     cd src/ &&     make &&     make install-base install-shell install-scm          install-plugin-scmcvs install-plugin-scmsvn install-plugin-scmgit          install-plugin-blocks install-plugin-moinmoin          install-plugin-taskboard install-plugin-message          install-plugin-repositoryapi install-plugin-mediawiki
      WARNING: yum clean all is not used. the yum cache will remain in this layer making the layer unnecessarily large. 
      Reference -> http://docs.projectatomic.io/container-best-practices/#_clear_packaging_caches_and_temporary_package_downloads
      
      
      Line 25: -> RUN yum --enablerepo=epel install -y supervisor
      WARNING: yum clean all is not used. the yum cache will remain in this layer making the layer unnecessarily large. 
      Reference -> http://docs.projectatomic.io/container-best-practices/#_clear_packaging_caches_and_temporary_package_downloads
      
      
      
      --------INFO---------
      
      Line 4: -> RUN yum -y update; yum clean all
      INFO: updating the entire base image may add unnecessary size to the container. update the entire base image may add unnecessary size to the container. 
      Reference -> http://docs.projectatomic.io/container-best-practices/#_clear_packaging_caches_and_temporary_package_downloads
      
      
      INFO: There is no 'CMD' instruction. None. 
      Reference -> https://docs.docker.com/engine/reference/builder/#cmd
      

      L'avantage de ces linter et qu'il devient très simple de les ajouter de manière automatique dans des procédures de tests, intégration continue histoire d'avoir toujours un aperçu de l'état des Dockerfile.

      • [^] # Re: Dockerfile

        Posté par (page perso) . Évalué à 7.

        Et sinon pour compléter sur l'usage des RUN, chaque RUN crée un nouveau layer. Il peut être intéressant de les limiter, ou d'en avoir plusieurs car on sait que l'un va changer et pas l'autre.
        Nénanmoins (et c'est indiqué dans la sortie du linter de projectatomic) il est bienvenue d'avoir un clean dans le RUN. Cela permet d'avoir un layer débarassé de toute trace temporaire qui ne ferait que grossir l'image pour rien.

        Cette partie layer, derrière les RUN, ne se comporte pas comme juste un enchainement de commandes shell comme on le ferait dans un script d'installation, ça reste un peu plus complexe. Mais comprendre le système de layer peut aider à avoir des images un peu plus propres et plus petites surtout, qui seront plus rapides à exécuter par exemple.

      • [^] # Re: Dockerfile

        Posté par (page perso) . Évalué à 6.

        Et histoire de continuer, si je devais maintenir ce Dockerfile je le changerais dans sa présentation pour le rendre (en tout cas à mon goût) plus lisible, qu'on voit mieux les différentes commandes et leurs arguments.

        Voici un exemple, c'est pas garanti que ça fonctionne comme souhaité c'est surtout pour la présentation.

        FROM centos:centos7
        MAINTAINER FusionForge TrivialDev <franck.villaume@trivialdev.com>
        LABEL maintainer "FusionForge TrivialDev <franck.villaume@trivialdev.com>"
        LABEL name "FusionForge"
        LABEL version "allinone"
        
        RUN yum -y install git openssh-server; yum clean all
        
        WORKDIR /opt/sources
        RUN git clone https://scm.fusionforge.org/anonscm/git/fusionforge/fusionforge.git
        
        WORKDIR /opt/sources/fusionforge
        RUN set -x \
            && source ./autoinstall/common-backports \
            && yum install -y \
                make \
                tar \
                backports_rpm \
            && yum --enablerepo=epel install -y httpd-itk \
            && yum install -y \
                gettext \
                php-cli \
                php-pgsql \
                php-process \
                php-mbstring \
                php-pear-HTTP \
                httpd \
                mod_dav_svn \
                mod_ssl \
                postgresql-server \
                postgresql-contrib \
                nscd \
                cvs \
                subversion \
                viewvc \
                python-pycurl \
                git \
                gitweb \
                xinetd \
                moin \
                mod_wsgi \
                python-psycopg2 \
                unoconv \
                poppler-utils \
                libreoffice-headless \
                cronie \
                mediawiki \
            && yum clean all
        
        WORKDIR /opt/sources/fusionforge/src
        RUN set -x \
            && make \
            && make \
                install-base \
                install-shell \
                install-scm \
                install-plugin-scmcvs \
                install-plugin-scmsvn \
                install-plugin-scmgit \
                install-plugin-blocks \
                install-plugin-moinmoin \
                install-plugin-taskboard \
                install-plugin-message \
                install-plugin-repositoryapi \
                install-plugin-mediawiki
        
        RUN yum --enablerepo=epel install -y supervisor && yum clean all
        
        RUN mkdir /var/run/sshd
        RUN /usr/sbin/sshd-keygen
        
        USER postgres
        RUN /usr/bin/initdb -D /var/lib/pgsql/data
        
        USER root
        COPY ./supervisord.conf /etc/supervisord.conf
        COPY ./startpoint.sh /startpoint.sh
        COPY ./postinstall.sh /postinstall.sh
        RUN chmod +x /startpoint.sh
        RUN chmod +x /postinstall.sh
        
        EXPOSE 22 80 443
        ENTRYPOINT ["/startpoint.sh"]
        CMD []
        
        • [^] # Re: Dockerfile

          Posté par (page perso) . Évalué à 2.

          Excellent ! Merci.

          • [^] # Re: Dockerfile

            Posté par (page perso) . Évalué à 5. Dernière modification le 14/06/17 à 11:31.

            Il y a une erreur dans le (mon) Dockerfile :

            RUN set -x \
                && source ./autoinstall/common-backports \
                && yum install -y \
                    make \
                    tar \
                && backports_rpm \
            

            La commande backports_rpm était passée à la trape.

            Il reste une question dans ce dockerfile, c'est l'update du début. Logiquement l'image docker de base devrait être à jour, c'est le principe tout de même.
            Je l'ai supprimée pour être ok vis à vis du linter, mais ça reste un choix.

            Et la sortie des linters:

            $ docker run --rm -it --privileged -v $PWD:/root/ projectatomic/dockerfile-lint dockerfile_lint lint
            
            -------WARNINGS--------
            
            Line 7: -> RUN yum -y install git openssh-server; yum clean all
            WARNING: installing SSH in a container is not recommended. Do you really need SSH in this image?. 
            Reference -> https://github.com/jpetazzo/nsenter
            
            $ docker run --rm -i sjourdan/hadolint < Dockerfile
            /dev/stdin:13 SC1091 Not following: File not included in mock.
            /dev/stdin:75 DL3002 Do not switch to root USER
            
  • # hein ?

    Posté par . Évalué à 2.

    1 - qu'est-ce que FusionForge ?
    2 - en quoi sa dockerisation est un évènement ?

    • [^] # Re: hein ?

      Posté par (page perso) . Évalué à 4.

      1 - qu'est-ce que FusionForge ?

      FusionForge vous aide à suivre l'intégralité de votre cycle de développement.

      FusionForge propose des outils pour faciliter la collaboration au sein de votre équipe de développement, avec des forums et des listes de diffusion, et des outils pour créer et contrôler l'accès à des systèmes de gestion de code source comme CVS et Subversion. FusionForge crée automatiquement les dépôts et règle le contrôle d'accès en fonction des rôles définis à l'intérieur du projet.

      Fonctionnalités supplémentaires :

      • Gestion des publications de fichiers.
      • Gestion des documents.
      • Annonces et nouvelles.
      • Sondages pour les utilisateurs et les administrateurs.
      • Suivi de problèmes sans limitation sur le nombre de catégories, de champs texte, etc.
      • Gestion de tâches.
      • Wiki (avec MediaWiki ou phpWiki).
      • Un système de greffons pour ajouter des fonctionnalités.

      2 - en quoi sa dockerisation est un évènement ?

      Étant donné que avant ce n'était pas dockerisé et que maintenant ça l'est, il s'agit bien d'un évènement, non ?

      • [^] # Re: hein ?

        Posté par . Évalué à 1.

        Merci.
        Une comparaison avec gitlab serait intéressante…

        • [^] # Re: hein ?

          Posté par (page perso) . Évalué à 1.

          Bonjour,

          c'est toujours un exercice difficile de faire ce type de comparaison.
          On va dire que Fusionforge est :
          - 100% opensource.
          - la continuité de gforge, qui était la continuité de sourceforge.

          que intègre les outils type (D)VCS: SVN, Git, Hg, Bzr, CVS
          que cela fournit un système très riche de tracker/roadmap et des fonctionnalités initiales Scrum/Kanban
          que la gestion documentaire est intégrée avec une GED et des moteurs de wikis (Mediawiki, MoinMoin, phpWiki)
          que cela fournit un espace de publication de fichiers organisé en package/release/file
          qu'un système de plugins permet de l'enrichir ou de s'intégrer avec des outils complémentaires (jenkins par exemple)
          que les API SOAP/Rest existent
          et plein d'autres fonctionnalités (forum, news, activity, project management, …)

          Des comparaisons fonctionnelles parfois incomplètes existent:
          https://forge-allura.apache.org/p/allura/wiki/Feature%20Comparison/

    • [^] # Re: hein ?

      Posté par (page perso) . Évalué à 5.

      2 - en quoi sa dockerisation est un évènement ?

      De mon point de vue, c'est très intéressant pour pouvoir tester le logiciel sans modifier directement son système.

      En effet, FusionForge s'interface avec des outils comme le serveur de mail en modifiant directement la configuration du service.

      Du coup, pour tester leur outil sur une machine, on est quasiment obligé de l'installer dans une machine virtuelle afin d'avoir une réelle compréhension de comment ça marche et ce que ça va demander comme changement dans ses services.

      Quitte à être dans cette situation, je pense que proposer une image Docker prêt à tester est très intéressant, même si comme dit dans l'annonce tout ne sera pas fonctionnel (comme les mailing lists automatiquement crées pour les projets).

      Pour moi c'est un petit événement qui peu apporter beaucoup au projet, puisque les utilisateurs / administrateurs systèmes seront plus en clin à le tester l'outil ☺

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.