


une manière élégante de corriger les ID utilisateur dans les conteneurs Docker à l'aide de 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
- avoir un environnement standard, facile à installer et à partager
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"]
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds











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.

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.

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 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.

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 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 isnotdying; il se révolte.1) C reste réévèreurtoitSversatity et effecciation en termes

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.
