web-dev-qa-db-fra.com

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

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

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

48
Daniel Gartmann

Alpine utilise la commande adduser et addgroup pour créer des utilisateurs et des groupes (plutôt que useradd et 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 adduser sont:

 Utilisation: adduser [OPTIONS] USER [GROUPE] 
 
 Créez un nouvel utilisateur ou ajoutez USER au GROUPE 
 
 -H Répertoire de base DIR 
 -g GECOS GECOS champ 
 -s Shell Login Shell 
 -G Groupe GRP 
 -S Créer un utilisateur système 
 -D Ne pas attribuer un mot de passe 
 -H Ne créez pas de répertoire de base 
 -u UID ID utilisateur 
 -k SKEL Répertoire squelette (/etc/skel)
.
100
Daniel Gartmann

Les commandes sont adduser et addgroup.

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

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

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

Notez les points suivants:

  • --disabled-password empêche l'invite de mot de passe
  • --gecos "" contourne l'invite pour "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 que Cruft ne soit copié dans le répertoire à partir de /etc/skel

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

Les drapeaux 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 si --ingroup n'est pas défini, le GID est assigné 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 l'exécution de conteneurs en tant qu'hôte UID/GID.

Mon script d'aide au point d'entrée peut être trouvé sur GitHub.

L'intention est de faire précéder ce script en tant que premier argument de ENTRYPOINT, ce qui devrait permettre à Docker d'inférer l'UID et le GID à partir d'un montage de liaison pertinent.

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

(Au moment de la rédaction, je n'ai pas de documentation pour mon script. Il est toujours sur la liste des tâches !!)

20
rexypoo