web-dev-qa-db-fra.com

Ajouter un utilisateur au conteneur Docker

J'ai un conteneur docker avec certains processus (uwsgi et céleri) en cours d'exécution à l'intérieur. Je souhaite 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 fichier Docker, mais cela pose problème, car ces commandes demandent une entrée (j'ai posté les réponses de la construction ci-dessous). 

Quel est le meilleur moyen d'ajouter des utilisateurs à un conteneur Docker afin de définir des autorisations pour les travailleurs s'exécutant dans le conteneur?

Mon image Docker est construite à partir de la base officielle Ubuntu14.04.

Voici la sortie du fichier 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] 
173
rfj001

L'astuce consiste à utiliser useradd au lieu de son wrapper interactif adduser. Je crée généralement des utilisateurs avec:

RUN useradd -ms /bin/bash newuser

qui crée un répertoire personnel pour l’utilisateur et garantit que bash est le shell par défaut. 

Vous pouvez ensuite ajouter:

USER newuser
WORKDIR /home/newuser

à votre fichier docker. Toutes les commandes et les sessions interactives seront ensuite exécutées en tant qu’utilisateur newuser:

docker run -t -i image
newuser@131b7ad86360:~$

Vous devrez peut-être donner à newuser les autorisations pour exécuter les programmes que vous avez l'intention d'exécuter avant d'appeler la commande utilisateur.

L'utilisation d'utilisateurs non privilégiés à l'intérieur de conteneurs est une bonne idée pour des raisons de sécurité. Il présente également quelques inconvénients. Plus important encore, les personnes générant des images à partir de votre image devront revenir à la racine avant de pouvoir exécuter des commandes avec les privilèges de superutilisateur.

319
Paul Staab

Pour éviter les questions interactives de adduser, vous pouvez l'appeler avec ces paramètres:

RUN adduser --disabled-password --gecos '' newuser

Le paramètre --gecos 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 

RUN adduser -D -g '' newuser

Voir busybox adduser

67
Raffael

Ubuntu

Essayez les lignes suivantes dans Dockerfile:

RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G Sudo -u 1000 ubuntu
USER ubuntu
WORKDIR /home/ubuntu

useradd options (voir: man useradd):

  • -r, --system Créez un compte système. voir: Implications créer comptes système
  • -m, --create-home Créez le répertoire de base de l'utilisateur.
  • -d, --home-dir HOME_DIR Répertoire de base du nouveau compte.
  • -s, --Shell SHELL Login Shell du nouveau compte.
  • -g, --gid GROUP Nom ou identifiant 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 exemple, ubuntu).

    Pour définir le mot de passe, ajoutez: -p "$(openssl passwd -1 ubuntu)" à la commande ci-dessus.

27
kenorb

Ajoutez cette ligne à votre fichier Docker (vous pouvez exécuter n'importe quelle commande linux de cette façon)

RUN useradd -ms /bin/bash yourNewUserName
2
Karl Morrison

Vous pouvez imiter un fichier Dockerfile open source, par exemple:

Node: node12-github

RUN groupadd --gid 1000 node \
    && useradd --uid 1000 --gid node --Shell /bin/bash --create-home node

sur-ensemble: sur-ensemble-github

RUN useradd --user-group --create-home --no-log-init --Shell /bin/bash 
    superset

Je pense que c'est un bon moyen de suivre l'open source.

1
Ryan Miao

Tout le monde a son préféré, et c'est le mien:

RUN useradd --user-group --system --create-home --no-log-init app
USER app

Référence: man useradd

La ligne RUN ajoutera l'utilisateur et le groupe app:

root@ef3e54b60048:/# id app
uid=999(app) gid=999(app) groups=999(app)

Utilisez un nom plus spécifique que app si l'image doit être réutilisée comme image de base. De plus, incluez --Shell /bin/bash si vous en avez vraiment besoin.


Crédit partiel: réponse de Ryan M

0
Acumenus

Ajouter un utilisateur dans docker et exécuter votre application sous cet utilisateur est une très bonne pratique du point de vue de la sécurité. Pour ce faire, je recommanderais les étapes suivantes:

FROM node:10-Alpine

# Copy source to container
RUN mkdir -p /usr/app/src

# Copy source code
COPY src /usr/app/src
COPY package.json /usr/app
COPY package-lock.json /usr/app

WORKDIR /usr/app

# Running npm install for production purpose will not run dev dependencies.
RUN npm install -only=production    

# Create a user group 'xyzgroup'
RUN addgroup -S xyzgroup

# Create a user 'appuser' under 'xyzgroup'
RUN adduser -S -D -h /usr/app/src appuser xyzgroup

# Chown all the files to the app user.
RUN chown -R appuser:xyzgroup /usr/app

# Switch to 'appuser'
USER appuser

# Open the mapped port
EXPOSE 3000

# Start the process
CMD ["npm", "start"]

Les étapes ci-dessus sont un exemple complet de copie de fichiers de projet NodeJS, création d'un groupe d'utilisateurs et d'un utilisateur, attribution d'autorisations à l'utilisateur pour le dossier de projet, passage au nouvel utilisateur créé et exécution de l'application sous cet utilisateur.

0
S.Mishra