Maison développement back-end C++ une manière élégante de corriger les ID utilisateur dans les conteneurs Docker à l'aide de docker_userid_fixer

une manière élégante de corriger les ID utilisateur dans les conteneurs Docker à l'aide de docker_userid_fixer

Aug 15, 2024 pm 06:42 PM

an elegant way to fix user IDs in docker containers using docker_userid_fixer

de quoi s'agit-il ?

Il s'agit d'un problème plutôt technique lié à l'utilisation de conteneurs Docker qui interagissent avec l'ordinateur hôte Docker, généralement lié à l'utilisation du système de fichiers hôte à l'intérieur du conteneur.
Cela se produit en particulier dans le contexte de recherches reproductibles.
J'ai développé un utilitaire open source qui permet de résoudre ce problème.

conteneurs Docker comme environnements d'exécution

Le cas d'utilisation initial et principal d'un conteneur Docker : une application autonome qui n'interagit qu'avec le système hôte avec certains ports réseau.
Pensez à une application web : le conteneur docker contient généralement un serveur web et une application web, s'exécutant par exemple sur le port 80 (à l'intérieur du conteneur). Le conteneur est ensuite exécuté sur l'hôte, en liant le port interne du conteneur 80 à un port hôte (par exemple 8000).
Ensuite, la seule interaction entre l'application conteneurisée et le système hôte se fait via ce port réseau lié.

Les conteneurs en tant qu'environnements d'exécution sont complètement différents :

  • au lieu de conteneuriser une application, c'est le système de build d'application qui est conteneurisé.
    • il peut s'agir d'un compilateur, d'un IDE, d'un moteur de notebook, d'un système de publication Quarto...
  • les objectifs sont :
    • avoir un environnement standard, facile à installer et à partager
      • imaginez un environnement de construction complexe, avec des versions fixes de R, Python et des millions de packages externes. Tout installer avec les bonnes versions peut être une tâche très difficile et fastidieuse. Partager une image docker contenant tout ce qui est déjà installé et préconfiguré est un véritable gain de temps.
    • avoir un environnement reproductible
      • en l'utilisant, vous êtes en mesure de reproduire certains résultats d'analyse, puisque vous utilisez le même environnement contrôlé
      • vous pouvez également facilement reproduire des bugs, ce qui est la première étape pour les corriger

Mais, pour utiliser ces environnements d'exécution, ces conteneurs doivent avoir accès au système hôte, en particulier au système de fichiers de l'utilisateur hôte.

conteneurs Docker et système de fichiers hôte

Supposons que vous ayez conteneurisé un IDE, par ex. Rstudio.
Votre Rstudio est installé et exécuté dans le conteneur Docker, mais il doit lire et modifier les fichiers dans votre dossier de projet.

Pour cela, vous liez le montage de votre dossier de projet (dans votre système de fichiers hôte) à l'aide de l'option docker run --volume.
Ensuite, vos fichiers sont accessibles depuis le conteneur Docker.

Le défi réside désormais dans les autorisations de fichiers. Supposons que votre utilisateur hôte ait l'ID utilisateur 1001 et supposons que l'utilisateur propriétaire du processus Rsudio dans le conteneur soit 0 (root) ou 1002.

Si l'utilisateur du conteneur est root, il n'aura aucun problème à lire vos fichiers.
Mais dès que vous modifiez des fichiers existants et en produisez de nouveaux (par exemple pdf, html), ces fichiers appartiendront à root également sur le système de fichiers hôte !.
Cela signifie que votre utilisateur hôte local ne pourra pas les utiliser, ni les supprimer, car ils appartiennent à root.

Maintenant, si l'ID utilisateur du conteneur est 1002, Rstudio risque de ne pas pouvoir lire vos fichiers, les modifier ou produire de nouveaux fichiers.
Même si c'est le cas, en définissant des autorisations très permissives, votre utilisateur hôte local ne pourra peut-être pas les utiliser.

Bien sûr, une façon bruteforce de résoudre ce problème consiste à exécuter avec root à la fois sur l'ordinateur hôte et dans le conteneur Docker. Cela n'est pas toujours possible et soulève des problèmes de sécurité critiques évidents.

résoudre le problème du propriétaire de fichier, partie 1 : l'option docker run --user

Comme on ne peut pas savoir à l'avance quel sera l'ID utilisateur de l'hôte (ici 1001), on ne peut pas préconfigurer
l'ID utilisateur de l'utilisateur du conteneur Docker.

docker run fournit désormais une option --user qui permet de créer un pseudo utilisateur avec un identifiant utilisateur fourni
au moment de l'exécution. Par exemple, docker run --user 1001 ... créera un conteneur Docker exécuté avec des processus
appartenant à un utilisateur avec l'ID utilisateur 1001.

Alors, de quoi discutons-nous encore sur cette question ? N'est-ce pas résolu ?

Voici quelques bizarreries à propos de cet utilisateur créé dynamiquement :

  • c'est un pseudo utilisateur
  • il n'a pas de répertoire personnel (/home/xxx)
  • il n'apparaît pas dans /etc/passwd
  • il ne peut pas être préconfiguré, par ex. avec un profil bash, quelques variables d'environnement, les valeurs par défaut de l'application, etc...

Nous pouvons contourner ces problèmes, mais cela peut être fastidieux et frustrant.
Ce que nous aimerions vraiment, c'est préconfigurer un utilisateur de conteneur Docker, et pouvoir changer dynamiquement son ID utilisateur au runtime...

résoudre le problème du propriétaire de fichier, partie 2 : entrez docker_userid_fixer

docker_userid_fixer est un utilitaire open source destiné à être utilisé comme point d'entrée Docker pour résoudre le problème d'ID utilisateur que je viens de soulever.

Voyons comment l'utiliser : vous le définissez comme votre docker ENTRYPOINT, en spécifiant quel utilisateur doit être utilisé et faites modifier dynamiquement son userid :

ENTRYPOINT ["/usr/local/bin/docker_userid_fixer","user1"]
Copier après la connexion

Soyons précis dans nos termes :

  • l'utilisateur cible, est l'utilisateur demandé à docker_userid_fixer, ici user1
  • l'utilisateur demandé est l'utilisateur provisionné par Docker Run, c'est-à-dire l'utilisateur qui (initialement) possède le premier processus (PID 1)

Ensuite, lors de la création du runtime du conteneur, il existe deux options :

  • soit l'ID utilisateur demandé correspond (déjà) à l'ID utilisateur cible, alors rien ne doit être modifié
  • ou bien ce n'est pas le cas. Par exemple, l'ID utilisateur demandé est 1001 et l'ID utilisateur cible est 100. Ensuite, docker_userid_fixer corrigera l'ID utilisateur de l'utilisateur cible user1 de 1000 à 1001, directement dans le processus principal du conteneur.

Donc, en pratique, cela résout notre problème :

  • Si vous n'avez pas besoin de corriger l'ID utilisateur de votre conteneur, utilisez simplement Docker Run de la manière habituelle (sans l'option --user)
  • ou vous utilisez l'option --user, puis en plus d'exécuter votre processus principal avec un ID utilisateur que vous avez demandé, il modifiera votre utilisateur préconfiguré en votre ID utilisateur demandé, afin que votre conteneur s'exécute avec l'utilisateur prévu et prévu. identifiant utilisateur.

configuration de docker_userid_fixer

Vous pouvez trouver des instructions sur la configuration ici.

Mais cela se résume à :

  • construisez ou téléchargez le petit exécutable (17k)

  • copiez-le dans votre image Docker

  • le rendre exécutable en tant que racine setuid

  • configurez-le comme point d'entrée

les détails sanglants

J'ai mis quelques courtes notes https://github.com/kforner/docker_userid_fixer#how-it-works
mais je vais essayer de reformuler.

Le nœud de l'implémentation est la racine setuid de l'exécutable docker_userid_fixer dans le conteneur.
Nous avons besoin des autorisations root pour modifier l'ID utilisateur, et ce setuid permet cette exécution privilégiée uniquement pour
le programme docker_userid_fixer, et cela pendant une durée très courte.

Dès que l'ID utilisateur aura été modifié si nécessaire, docker_userid_fixer changera le processus principal
à l'utilisateur demandé (et à l'ID utilisateur !).

Si ces sujets vous intéressent (docker, recherche reproductible, développement de packages R, algorithmique, optimisation des performances, parallélisme...) n'hésitez pas à me contacter pour discuter d'opportunités d'emploi et d'affaires.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
Nordhold: Système de fusion, expliqué
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1673
14
Tutoriel PHP
1278
29
Tutoriel C#
1257
24
C # vs C: Histoire, évolution et perspectives d'avenir C # vs C: Histoire, évolution et perspectives d'avenir Apr 19, 2025 am 12:07 AM

L'histoire et l'évolution de C # et C sont uniques, et les perspectives d'avenir sont également différentes. 1.C a été inventé par Bjarnestrousstrup en 1983 pour introduire une programmation orientée objet dans le langage C. Son processus d'évolution comprend plusieurs normalisations, telles que C 11, introduisant des mots clés automobiles et des expressions de lambda, C 20 introduisant les concepts et les coroutines, et se concentrera sur les performances et la programmation au niveau du système à l'avenir. 2.C # a été publié par Microsoft en 2000. Combinant les avantages de C et Java, son évolution se concentre sur la simplicité et la productivité. Par exemple, C # 2.0 a introduit les génériques et C # 5.0 a introduit la programmation asynchrone, qui se concentrera sur la productivité et le cloud computing des développeurs à l'avenir.

C # vs C: courbes d'apprentissage et expérience du développeur C # vs C: courbes d'apprentissage et expérience du développeur Apr 18, 2025 am 12:13 AM

Il existe des différences significatives dans les courbes d'apprentissage de l'expérience C # et C et du développeur. 1) La courbe d'apprentissage de C # est relativement plate et convient au développement rapide et aux applications au niveau de l'entreprise. 2) La courbe d'apprentissage de C est raide et convient aux scénarios de contrôle haute performance et de bas niveau.

Qu'est-ce que l'analyse statique en C? Qu'est-ce que l'analyse statique en C? Apr 28, 2025 pm 09:09 PM

L'application de l'analyse statique en C comprend principalement la découverte de problèmes de gestion de la mémoire, la vérification des erreurs de logique de code et l'amélioration de la sécurité du code. 1) L'analyse statique peut identifier des problèmes tels que les fuites de mémoire, les doubles versions et les pointeurs non initialisés. 2) Il peut détecter les variables inutilisées, le code mort et les contradictions logiques. 3) Les outils d'analyse statique tels que la couverture peuvent détecter le débordement de tampon, le débordement entier et les appels API dangereux pour améliorer la sécurité du code.

C et XML: Explorer la relation et le soutien C et XML: Explorer la relation et le soutien Apr 21, 2025 am 12:02 AM

C interagit avec XML via des bibliothèques tierces (telles que TinyXML, PUGIXML, XERCES-C). 1) Utilisez la bibliothèque pour analyser les fichiers XML et les convertir en structures de données propices à C. 2) Lors de la génération de XML, convertissez la structure des données C au format XML. 3) Dans les applications pratiques, le XML est souvent utilisé pour les fichiers de configuration et l'échange de données afin d'améliorer l'efficacité du développement.

Comment utiliser la bibliothèque Chrono en C? Comment utiliser la bibliothèque Chrono en C? Apr 28, 2025 pm 10:18 PM

L'utilisation de la bibliothèque Chrono en C peut vous permettre de contrôler plus précisément les intervalles de temps et de temps. Explorons le charme de cette bibliothèque. La bibliothèque Chrono de C fait partie de la bibliothèque standard, qui fournit une façon moderne de gérer les intervalles de temps et de temps. Pour les programmeurs qui ont souffert de temps et ctime, Chrono est sans aucun doute une aubaine. Il améliore non seulement la lisibilité et la maintenabilité du code, mais offre également une précision et une flexibilité plus élevées. Commençons par les bases. La bibliothèque Chrono comprend principalement les composants clés suivants: std :: chrono :: system_clock: représente l'horloge système, utilisée pour obtenir l'heure actuelle. std :: chron

L'avenir de C: adaptations et innovations L'avenir de C: adaptations et innovations Apr 27, 2025 am 12:25 AM

L'avenir de C se concentrera sur l'informatique parallèle, la sécurité, la modularisation et l'apprentissage AI / Machine: 1) L'informatique parallèle sera améliorée par des fonctionnalités telles que les coroutines; 2) La sécurité sera améliorée par le biais de mécanismes de vérification et de gestion de la mémoire plus stricts; 3) La modulation simplifiera l'organisation et la compilation du code; 4) L'IA et l'apprentissage automatique inviteront C à s'adapter à de nouveaux besoins, tels que l'informatique numérique et le support de programmation GPU.

C: Est-ce que je meure ou est simplement en évolution? C: Est-ce que je meure ou est simplement en évolution? Apr 24, 2025 am 12:13 AM

C isnotdying; il se révolte.1) C reste réévèreurtoitSversatity et effecciation en termes

C # vs C: Gestion de la mémoire et collecte des ordures C # vs C: Gestion de la mémoire et collecte des ordures Apr 15, 2025 am 12:16 AM

C # utilise le mécanisme de collecte automatique des ordures, tandis que C utilise la gestion manuelle de la mémoire. 1. Le collecteur des ordures de C # gère automatiquement la mémoire pour réduire le risque de fuite de mémoire, mais peut entraîner une dégradation des performances. 2.C fournit un contrôle de mémoire flexible, adapté aux applications qui nécessitent une gestion des beaux, mais doivent être manipulées avec prudence pour éviter les fuites de mémoire.

See all articles