Comment ajouter un utilisateur lorsque j'utilise Alpine comme image de base?

99

j'utilise alpine (ou une image basée sur Alpine) comme image de base dans mon Dockerfile. Quelles instructions dois-je ajouter pour créer un utilisateur?

Finalement, j'utiliserai cet utilisateur pour exécuter l'application que je placerai dans le conteneur afin que l'utilisateur root ne le fasse pas.

Daniel Gartmann
la source

Réponses:

207

Alpine utilise la commande adduseret addgrouppour créer des utilisateurs et des groupes (plutôt que useraddet usergroup).

FROM alpine:latest

# Create a group and user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# Tell docker that all future commands should run as the appuser user
USER appuser

Les drapeaux pour addusersont:

Utilisation: adduser [OPTIONS] USER [GROUP]

Créer un nouvel utilisateur ou ajouter USER à GROUP

        -h Répertoire de base DIR
        -g Champ GECOS GECOS
        -s SHELL Shell de connexion
        -G Groupe GRP
        -S Créer un utilisateur système
        -D Ne pas attribuer de mot de passe
        -H Ne crée pas de répertoire personnel
        -u UID ID utilisateur
        -k SKEL Répertoire Skeleton (/ etc / skel)

Ajouter de nouveaux documents officiels d'utilisateur

Daniel Gartmann
la source
7
Ou bien, vous pouvez remplacer tout l'extrait de code ci-dessus en utilisant ceci: USER 405qui est l'utilisateur invité dans Alpine Linux.
Daniel Gartmann
8
Pourquoi pas USER guest?
user672009
3
J'irais avec la création d'un nouvel utilisateur parce que je veux que cet utilisateur ait le même UID / GID que celui du système d'exploitation hôte, afin qu'il n'y ait pas de problème d'autorisation lors de l'exécution de docker sous Linux. (pas un problème avec les utilisateurs de macOS / Windows)
elquimista
5
Notez que puisque Alpine est basé sur BusyBox, ses commandes adduseret addgroupsont différentes de adduseret addgrouptelles que fournies par Debian et Ubuntu qui à leur tour sont des frontaux vers useraddet groupadd. Notamment, les commandes Debian et Ubuntu ne prennent en charge que les options de forme longue. Voir: manpages.debian.org/stretch/adduser/adduser.8.en.html
Jack
J'ai déjà créé un conteneur Docker, maintenant quelle commande dois-je exécuter pour ajouter un utilisateur?
Aashish Kumar
63

Les commandes sont adduseret addgroup.

Voici un modèle pour Docker que vous pouvez utiliser dans les environnements busybox (alpin) ainsi que dans les environnements basés sur Debian (Ubuntu, etc.):

ENV USER=docker
ENV UID=12345
ENV GID=23456

RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "$(pwd)" \
    --ingroup "$USER" \
    --no-create-home \
    --uid "$UID" \
    "$USER"

Notez ce qui suit:

  • --disabled-password empêche l'invite de mot de passe
  • --gecos "" contourne l'invite "Nom complet" etc. sur les systèmes basés sur Debian
  • --home "$(pwd)"définit le domicile de l'utilisateur sur WORKDIR. Vous ne voudrez peut-être pas cela.
  • --no-create-home empêche la copie de cruft dans le répertoire de /etc/skel

La description d'utilisation de ces applications ne contient pas les indicateurs longs présents dans le code pour adduser et addgroup .

Les indicateurs de forme longue suivants devraient fonctionner à la fois dans les dérivés alpins et Debian:

adduser

BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.

Usage: adduser [OPTIONS] USER [GROUP]

Create new user, or add USER to GROUP

        --home DIR           Home directory
        --gecos GECOS        GECOS field
        --shell SHELL        Login shell
        --ingroup GRP        Group (by name)
        --system             Create a system user
        --disabled-password  Don't assign a password
        --no-create-home     Don't create home directory
        --uid UID            User id

Une chose à noter est que s'il --ingroupn'est pas défini, le GID est attribué pour correspondre à l'UID. Si le GID correspondant à l'UID fourni existe déjà, adduser échouera.

ajouter un groupe

BusyBox v1.28.4 (2018-05-30 10:45:57 UTC) multi-call binary.

Usage: addgroup [-g GID] [-S] [USER] GROUP

Add a group or add a user to a group

        --gid GID  Group id
        --system   Create a system group

J'ai découvert tout cela en essayant d'écrire ma propre alternative au projet fixuid pour exécuter des conteneurs en tant qu'UID / GID de l'hôte.

Mon script d'assistance de point d'entrée peut être trouvé sur GitHub.

L'intention est d'ajouter ce script comme premier argument ENTRYPOINTauquel Docker devrait déduire l'UID et le GID d'un montage de liaison pertinent.

Une variable d'environnement "TEMPLATE" peut être requise pour déterminer d'où les autorisations doivent être déduites.

(Au moment d'écrire ces lignes, je n'ai pas de documentation pour mon script. Il est toujours sur la liste des choses à faire !!)

rexypoo
la source
9
+1, l'utilisation de la forme longue pour les arguments de commande augmente la lisibilité et facilite la maintenance. Lors de l'écriture de scripts shell, utilisez toujours la forme longue (Dockerfile RUN n'est rien d'autre qu'un script shell).
Victor Schröder