J'ai un conteneur docker avec certains processus (uwsgi et céleri) en cours d'exécution à l'intérieur. Je veux créer un utilisateur céleri et un utilisateur uwsgi pour ces processus ainsi qu'un groupe de travailleurs auquel ils appartiendront tous les deux, afin d'attribuer des autorisations.
J'ai essayé d'ajouter RUN adduser uwsgi
et RUN adduser celery
à mon Dockerfile, mais cela pose des problèmes, car ces commandes demandent une entrée (j'ai publié les réponses de la build ci-dessous).
Quelle est la meilleure façon d'ajouter des utilisateurs à un conteneur Docker afin de définir des autorisations pour les travailleurs exécutés dans le conteneur?
Mon image Docker est construite à partir de la base officielle Ubuntu14.04.
Voici la sortie du Dockerfile lorsque les commandes adduser sont exécutées:
Adding user `uwsgi' ...
Adding new group `uwsgi' (1000) ...
Adding new user `uwsgi' (1000) with group `uwsgi' ...
Creating home directory `/home/uwsgi' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for uwsgi
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []: Work Phone []: Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
---> 258f2f2f13df
Removing intermediate container 59948863162a
Step 5 : RUN adduser celery
---> Running in be06f1e20f64
Adding user `celery' ...
Adding new group `celery' (1001) ...
Adding new user `celery' (1001) with group `celery' ...
Creating home directory `/home/celery' ...
Copying files from `/etc/skel' ...
[91mEnter new UNIX password: Retype new UNIX password: [0m
[91mpasswd: Authentication token manipulation error
passwd: password unchanged
[0m
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 563.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 564.
[0m
Try again? [y/N]
Changing the user information for celery
Enter the new value, or press ENTER for the default
Full Name []: Room Number []: Work Phone []:
Home Phone []: Other []:
[91mUse of uninitialized value $answer in chop at /usr/sbin/adduser line 589.
[0m
[91mUse of uninitialized value $answer in pattern match (m//) at /usr/sbin/adduser line 590.
[0m
Is the information correct? [Y/n]
la source
useradd --create-home --shell /bin/bash
est plus compréhensible / lisible pour les collègues.RUN echo 'newuser:newpassword' | chpasswd
--no-log-init
optionuseradd
.USER newuser
. Si vous avez également besoin que l'utilisateur dispose de privilèges root, vous pouvez également les inclureadduser <username> sudo
./bin/sh: useradd: not found
alpine linuxPour éviter les questions interactives par adduser, vous pouvez l'appeler avec ces paramètres:
Le
--gecos
paramètre est utilisé pour définir les informations supplémentaires. Dans ce cas, il est juste vide.Sur les systèmes avec busybox (comme Alpine), utilisez
Voir addbox busybox
la source
adduser
solution de haut niveau soit généralement préférée à l'utilisation de fonctions de bas niveau commeuseradd
.adduser: unrecognized option: gecos
Cela ne semble pas fonctionner sur Alpine.Ubuntu
Essayez les lignes suivantes dans
Dockerfile
:useradd
options (voir:)man useradd
:-r
,--system
Créez un compte système. voir: Implications de la création de comptes système-m
,--create-home
Créez le répertoire personnel de l'utilisateur.-d
,--home-dir HOME_DIR
Répertoire personnel du nouveau compte.-s
,--shell SHELL
Shell de connexion du nouveau compte.-g
,--gid GROUP
Nom ou ID du groupe principal.-G
,--groups GROUPS
Liste des groupes supplémentaires.-u
,--uid UID
Spécifiez l'ID utilisateur. voir: Comprendre comment uid et gid fonctionnent dans les conteneurs Docker-p
,--password PASSWORD
Mot de passe crypté du nouveau compte (par exempleubuntu
).Définition du mot de passe de l'utilisateur par défaut
Pour définir le mot de passe utilisateur, ajoutez
-p "$(openssl passwd -1 ubuntu)"
à lauseradd
commande.Vous pouvez également ajouter les lignes suivantes à votre
Dockerfile
:La première instruction shell est de s'assurer que cette
-o pipefail
option est activée avantRUN
avec un tube dedans. En savoir plus: Hadolint: Linting your Dockerfile .la source
root
Le groupe n'indique pas qu'ils ont un accès root, mais juste qu'ils ont plus d'accès en lecture à certains fichiers (tels que les journaux), ce qui est utile, mais cela dépend du projet.Ajouter un utilisateur dans Docker et exécuter votre application sous cet utilisateur est une très bonne pratique pour le point de vue de la sécurité. Pour ce faire, je recommanderais les étapes ci-dessous:
Les étapes ci-dessus sont un exemple complet de la copie de fichiers de projet NodeJS, de la création d'un groupe d'utilisateurs et d'un utilisateur, de l'attribution d'autorisations à l'utilisateur pour le dossier du projet, du passage à l'utilisateur nouvellement créé et de l'exécution de l'application sous cet utilisateur.
la source
Vous pouvez imiter Dockerfile open source, par exemple:
Noeud: node12-github
surensemble: superset-github
Je pense que c'est un bon moyen de suivre l'open source.
la source
Chacun a son favori personnel, et voici le mien:
Référence: man useradd
La
RUN
ligne ajoutera l'utilisateur et le groupeapp
:Utilisez un nom plus spécifique que
app
si l'image doit être réutilisée comme image de base. En aparté, indiquez--shell /bin/bash
si vous en avez vraiment besoin.Crédit partiel: réponse de Ryan M
la source
Alternativement, vous pouvez faire comme ça.
La première commande crée un groupe appelé démo . La deuxième commande crée l' utilisateur de démonstration et l'ajoute au groupe de démonstration précédemment créé .
Drapeaux signifie:
la source
Ajoutez cette ligne à votre Dockerfile (vous pouvez exécuter n'importe quelle commande linux de cette façon)
la source