• [^] # Re: Root

    Posté par (site web personnel, Mastodon) . En réponse au journal LinuxFr avec Docker. Évalué à 4.

    Pour ce qui est du mapping des uid/gid, quand on veut utiliser un bind-mount (c'est à dire monter un répertoire depuis l'hôte dans le conteneur), c'est vraiment la merde car y'a pas d'API.

    Pourquoi alors que ce ne serait pas très compliqué (il y a un namespace pour les uid/gid dans le noyau Linux, donc ça serait sûrement assez peu de code) ? À mon avis parce que les personnes/entreprises qui développent pour docker/compose/kubernetes/whatever sont orientés vers du déploiement sur des infrastructure avec orchestrateur et pas pour un déploiement « dev local » comme ici.

    Cette situation dure depuis longtemps et il n'y a pas d'amélioration à l'horizon.

    Et pour cause, certains pensent aussi que pour du « dev local » c'est pas si grave de faire tourner des services en root. Le hic c'est que ça oblige à avoir un système de conteneurs différent pour le dev et pour la prod, ce qui en soit est forcément source de problème (si on fait tourner des conteneurs en prod).

    Il existe des hacks, plus ou moins réussis. En voici un :

    • utiliser le fichier .env pour il déclarer deux variables pour compose, UID et GID comme suit :
    UID=$(id -u)
    GID=$(id -g)
    • utiliser ces variables dans la section environments d'un service :
    mon_service:
     environments:
     - "UID=$UID"
     - "GID=$GID"
     volumes:
     - "$chemin_sur_l_hote:/chemin/final:ro"

    Utiliser un docker entrypoint qui va faire ce travail :

    • Si id -u est 0 (root), alors :
      • créer un utilisateur dans docker avec l'uid/gid défini dans les variables UID/GID
      • fixer d'autres permissions ou config en utilisant cet utilisateur
      • se relancer avec cet utilisateur
    • Sinon continuer la procédure classique de l'entrypoint.

    Avec cette solution, le conteneur démarre en root, mais perd ses privilèges dès l'entrypoint, ce qui fait qu'au final les processus dans le conteneurs ne tournent pas en root (et c'est ça qui compte).

    Par contre c'est assez casse-pied à mettre en place, surtout le rappel de l'entrypoint par lui-même : à base de exec et de su user /docker-entrypoint arg1 arg2 ...

    Si quelqu'un a un meilleur hack, je suis preneur ;-)