Forum Linux.debian/ubuntu Docker montage local/NFS

Posté par . Licence CC by-sa
1
3
oct.
2016

Bonjour à tous,

nous sommes sur Debian 8 avec la version de Docker "version 1.12.1, build 23cf638"
Nous avons besoin de faire une install auto d'une BDD. Nous souhaitons que les fichiers mysql habituellement dans /var/lib/mysql/ soient dans le même répertoire mais que ce dernier soit un montage NFS.

Sur le système nous avons plusieurs montage NFS qui fonctionnent. Nous avons effectué une maquette avec "Rancher" pas de problème le NFS est monté dans le docker.
En revanche impossible de faire le montage via Dockerfile. Le résultat est identique pour un simple répertoire de l'OS que nous souhaitons partager.

Dans le docker file nous avons testé les configurations suivantes:

RUN mkdir /run/mysqld && mkdir /var/lib/mysql/ && chmod 777 /var/lib/mysql/ && \
mount -t nfs4 x.x.x.x:/mnt/bdd/docker-build-test /var/lib/mysql/ &&\
echo "x.x.x.x:/mnt/bdd/docker-build-test /var/lib/mysql/ nfs  defaults 0  0" >> /etc/fstab && \
mount -a

Résultat:
not allowed

Ensuite nous avons voulu passer par des alias une fois le /mnt/bdd/docker-build-test

RUN ln -s /mnt/bdd/docker-build-test /var/lib/mysql
VOLUME ["/opt"]

Il me créer un montage mais qui pointe vers /dev/sda2 et les fichiers sont disponibles dans /var/lib/docker/volumes/90af8fa4a62b752b6253347a7368951d2779392fc4758629377127af092af431/_data/
Avez une idée svp…?

  • # Créer sa propre image docker

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

    J'essaierai à votre place de créer directement vous même une image docker en utilisant debootstrap et docker import: https://docs.docker.com/engine/userguide/eng-image/baseimages/

    Comme ça, vous pouver directement créer la ligne NTFS dans fstab sans avoir d'erreur. Si jamais, il faut utiliser des entrées bind dans fstab (ou mount avec le type bind) au lieu de faire des liens symboliques entre deux montages différents.

    • [^] # Re: Créer sa propre image docker

      Posté par . Évalué à 1.

      Bonjour,

      merci pour cette réponse.

      L'image que nous utilisons et la debian classée" "officielle". Nous avons un problème avec le partage NFS et non le NTFS.

      ++

      • [^] # Re: Créer sa propre image docker

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

        Désolé, je voulais écrire NFS effectivement. Quel est l'intérêt d'itiliser l'image «officielle» de Debian sur Docker Hub ?

        Debootstrap est aussi un outil officiel de Debian et il construit directement tout le nécessaire pour en faire une image docker par simple import. Vous aurez en plus l'avantage de ne charger Debian qu'une fois depuis Internet et vous pouvez préparez directement les fichiers systèmes spécifiques à vos besoins.

        • [^] # Re: Créer sa propre image docker

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

          PS: j'ai mis officiel entre guillemet car il peut y avoir des tas d'images possibles de Debian: du desktop avec GNOME, KDE, … aux images de serveurs, selon plusieurs architectures processeurs… C'est pas pour rien qu'ils se disent universel :)

  • # docker -v

    Posté par . Évalué à 1.

    Bonjour,
    Personnellement, je n'essayerais pas d'installer un client nfs dans le container. Je partagerais le dossier /var/lib/mysql sur l'hôte afin d'assurer la persistance des données et je le partagerais par NFS depuis l'hôte. L'avantage est de garder une image mysql vanilla et de bénéficier de la persistance de donnée. Il est aussi possible de partager les données via un autre container qui est équipé pour les partages NFS. Dans ce deuxième container, le dossier /var/lib/mysql du container 1 est partagé dans /media/share du container 2 par exemple. C'est /media/share qui est partagé par NFS. docker-compose permet de réaliser ce montage facilement et de faciliter le découpage par tâche.

    Sinon, est-ce que vous avez bien ajouté USER 0 avant les lignes suivantes?

    RUN mkdir /run/mysqld && mkdir /var/lib/mysql/ && chmod 777 /var/lib/mysql/ && \
    mount -t nfs4 x.x.x.x:/mnt/bdd/docker-build-test /var/lib/mysql/ &&\
    echo "x.x.x.x:/mnt/bdd/docker-build-test /var/lib/mysql/ nfs  defaults 0  0" >> /etc/fstab && \
    mount -a
    
    • [^] # Re: docker -v

      Posté par . Évalué à 1.

      Bonjour,

      Merci mais que veux tu dire par ajout du USER 0 (root)?

      Peux tu me donner un exemple stp?

      • [^] # Re: docker -v

        Posté par . Évalué à 1.

        L'user 0 est bien root. Si tu veux exécuter des commandes en tant que root, il faut s'assurer que tu aies les bons droits. Tu peux essayer de modifier légèrement ton DOCKERFILE:

        USER 0
        RUN mkdir /run/mysqld
        RUN mkdir /var/lib/mysql/
        RUN chmod 777 /var/lib/mysql/ 
        RUN mount -t nfs4 x.x.x.x:/mnt/bdd/docker-build-test /var/lib/mysql/ 
        RUN echo "x.x.x.x:/mnt/bdd/docker-build-test /var/lib/mysql/ nfs  defaults 0  0" >> /etc/fstab 
        RUN mount -a
        

        L'avantage est qu'il va créer une image à chaque ligne. Si il échoue et que tu modifies la troisième ligne, il repartiras de là sans réexécuter la première et la deuxième ligne (il part de la dernière image qui fonctionne). De plus, il te donneras un message d'erreur que tu pourras relier à la commande qui pose problème. Pour le moment, comme toutes les commandes correspondent à une seule ligne, tu ne sais pas quelle étape échoue réellement.

        Par ailleurs, il n'est pas possible de rationaliser le chmod 777 ? En général, on évite car ça donne touts les droits à tout le monde. Il n'est pas possible de trouver un groupe "partage" qui aurait accès en lecture et éventuellement écriture au répertoire /var/lib/mysql/ sans que tout le monde puisse lire le contenu?

        • [^] # Re: docker -v

          Posté par . Évalué à 1.

          Merci

          j'ai appliqué ta méthode mais j'ai toujours le même résultat

          mount.nfs: rpc.statd is not running but is required for remote locking.
          mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
          mount.nfs: an incorrect mount option was specified

          J'ai basculé sur le conteneur et effectué un telnet IP NFS=> OK.
          j'ai testé le montage manuellement du volume avec l'option '-o nolock' sans succès.

          • [^] # Re: docker -v

            Posté par . Évalué à 2.

            j'ai testé le montage manuellement du volume avec l'option '-o nolock' sans succès

            ca tombe bien il propose une autre option

            rpc.statd is not running
            Either use '-o nolock' to keep locks local, or start statd

            donc plus qu'à installer rpcbind ou rpc.statd et à le demarrer

            • [^] # Re: docker -v

              Posté par . Évalué à 1.

              Merci mais l'installation est a effectuer sur le docker où le host (socle) qui héberge le docker?
              Car nous avons le message suivant sur le docker "ln: failed to create symbolic link '/run/sendsigs.omit.d/rpcbind': No such file or directory" lors du démarrage du service rpcbind.

              • [^] # Re: docker -v

                Posté par . Évalué à 2.

                En principe l'installation doit avoir lieu dans le dockerfile. Les images de base sont allégées et il faudra probablement fortement la modifier pour que nfs soit utilisable à l'intérieur. C'est pourquoi ma solution privilégiée serait de découpler le service en un container pour MySQL et un autre pour nfs. Voire, plus simple: créer un partage du dossier /Var/lib/MySQL et partager le dossier correspondant sur l'hôte à l'aide de nfs (installé sur l'hôte donc). À mon avis, ce serait plus simple, plus dans l'esprit docker et plus modulable.

                • [^] # Re: docker -v

                  Posté par . Évalué à 2.

                  C'est le cas le mysql est dans un docker à part mais je ne souhaite pas que les données de la BDD soient dans le docker mais dans un volume montée en NFS.

                  Enfin nous avons un autre docker apache dont les images ne doivent pas être stockées sur le docker non plus car trop volumineuses. Nous souhaitons aussi utilisé du NFS.

                  Même avec un fichier dockercompose.yml nous n'avons pas de configurations qui montent les NFS de façon automatisés lors du déploiement du docker.

                  Je vais tout de même essayer la solution qui ne me plaît pas forcément "docker-volume-netshare" car cela signifie que si nous souhaitons déployer l'automatisation de l'installation nous serons pénalisé (dépendance avec le docker docker-volume-netshare)

                  Merci encore pour les idées.

    • [^] # Re: docker -v

      Posté par . Évalué à 2.

      Bonjour,

      petit up

      j'ai testé avec docker-compose. En effet les montages sont mieux gérés. Voici mon fichier

      testcompose:
        volumes:
        - /mnt/bdd/docker-build-test:/var/lib/mysql/:rw
        build: engine/
        command:
          - /script/mysql-data-install.sh

      Dans engine j'ai mis le Dockerfile.

      Le script mysql-data-install.sh effectue l'action suivante:
      -Une vérification du /var/lib/mysql/ si il existe des fichiers.
      -Dans le cas où des fichiers sont inexistants une copie de mysql.ori anciennement de mysql sera copié dans le montage /var/lib/mysql/
      -Sinon aucune action n'est effectué.

      Tout fonctionne bien sauf que le docker ne reste pas actif et nous avons le message suivant dans

      #docker-compose logs "nomdudocker"
      compose_testcompose_1 exited with code 0

      extrait de mysql-data-install.sh

      mysql=/var/lib/mysql/
      check_mysql=`ls $mysql 2>1 dev/null | wc -l`
      if [ $check_mysql -eq 0 ]
      then
       cp -prvf /var/lib/mysql.ori/* /var/lib/mysql/
       fi

      Après avoir effectué plusieurs recherches je n'arrive pas à résoudre le problème.

      En revanche je peux faire

      docker-compose run testcompose

      Mais lorsque que je quitte le conteneur il est automatiquement arrêté (ce qui est normal option run).

      • [^] # Re: docker -v

        Posté par . Évalué à 2.

        Bonjour,

        Je suis content de voir que tu avances.

        Le problème du container qui s'arrête après avoir lancé sa commande est connu. Je l'avais également avec un container qui effectuait une sauvegarde d'une BDD postgresql mais c'était voulu. Il est possible de laisser tourner le container. Il faut peut-être s'inspirer du côté des container mysql du hub:
        https://hub.docker.com/_/mysql/
        Il faut notamment regarder du côté des scripts "entrypoint".
        Il y en a de plusieurs sortes et ce sont eux qui sont lancés au démarrage du container.

        • [^] # Re: docker -v

          Posté par . Évalué à 2.

          En effet j'ai trouvé la solution en ajout dans le Dockerfile la ligne suivante à la dernière ligne:
          ENTRYPOINT /bin/sh

        • [^] # Re: docker -v

          Posté par . Évalué à 2.

          Avant de clôturer le post.

          J'ai appliqué une méthode qui passe par une étape intermédiaire qui (je pense) peut être amélioré concernant les datas de la BDD.

          En effet ne pouvant pas monter le volume nfs avant l'exécution (pour le moment)lors de l'appel du docker-compose.yml qui fait appel au Dockerfile. Nous sommes obligés de copier l'ensemble des éléments de /var/lib/mysql vers /var/lib/mysql.ori par exemple.

          Ensuite dans docker-compose.yml nous faisons appel à un script qui va vérifier si /var/lib/mysql qui sera un montage; dans le cas contraire une copie des fichiers de /var/lib/mysql.ori seront déplacés vers /var/lib/mysql

          Et enfin nous avons notre docker automatisé avec la BDD sur un montage NFS.

          Est-il possible de monter les volumes avant l'exécution du Dockerfile pour éviter ce type de manipulation?

          • [^] # Re: docker -v

            Posté par . Évalué à 1.

            Je ne connaît pas assez docker-compose mais il ne me semble pas qu'il y ait possibilité de faire des pré/post commandes.
            https://github.com/docker/compose/issues/468

            Je ne suis pas certain d'avoir totalement compris la demande. Détrompe-moi si je dis une bêtise. Je dirais qu'il faut créer un script qui effectue toutes les démarches en dehors de docker-compose:
            1) montage du point /mnt/bdd/docker-build-test qui accueille les données de mysql
            2) vérifications si /mnt/bdd/docker-build-test contient bien des données
            3) choix d'un Dockerfile en fonction du résultat:
            mv Dockerfile_mysql_OK Dockerfile ou mv Dockerfile_mysql_KO Dockerfile
            5) docker-compose up

            Si les outils de montage NFS sont disponibles sur l'hôte, il n'y a rien qui empêche de faire les vérifications avant de lancer docker-compose up.

            • [^] # Re: docker -v

              Posté par . Évalué à 1.

              voici le fichier docker-compose.yml

              testcompose:
                volumes:
                - /mnt/bdd/docker-build-test:/var/lib/mysql/:rw
                build: engine/
                command:
                - /"maboite"/script/mysql-data-install.sh
                - /etc/init.d/mysql start
                stdin_open: true
                tty: true

              Pour résumer de l'état actuel
              1-Nous avons un Dockerfile qui est appelé par le build
              1-1 Installation de tout les paquets
              1-2 BDD installée dans /var/lib/mysql qui n'est pas montée en NFS pour le moment
              1-3 copie du script qui check si file existe dans /var/lib/mysql si c'est pas le copie des éléments de
              /var/lib/mysql.old vers /var/lib/mysql
              2-Montage des volumes NFS sur /var/lib/mysql
              3-Lancement du script pour contrôle du contenu NFS dans /var/lib/mysql
              3-1 Démarrage de mysql

              L'idéal serait de monter le volume NFS avant l'installation de la BDD pour ne pas passer par l'étape intermédiaire via le script mysql-data-install.sh.
              Mais le problème c'est que la command build est exécutée en premier même en modifiant l'ordre dans le fichier docker-compose.yml

              • [^] # Re: docker -v

                Posté par . Évalué à 1.

                Il est normal que le build soit réalisé avant reste car avant ça, on a pas de container.

                Pourquoi ne pas installer MySQL dans le script data_install.sh?
                Les données seraient déjà montées dans le bon dossier avec les bonnes permissions et l'installation de MySQL détecterait que le dossier existe et est rempli avec les données sans l'écraser.

                • [^] # Re: docker -v

                  Posté par . Évalué à 2.

                  Avec docker compose je peux monter le volume avant l'exécution du reste (Dockerfile).

                  J'avance encore sur le déploiement et par la suite je mettrai en détail les fichiers de conf.

                  Merci encore.

Suivre le flux des commentaires

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