2 votes

Useradd avec l'option -u provoque un blocage de docker

J'ai le fichier docker suivant

FROM ubuntu:18.04

ARG user_id
ARG user_gid

# Paquets essentiels pour la construction sur un hôte Ubuntu
# https://docs.yoctoproject.org/ref-manual/system-requirements.html#ubuntu-and-debian
# Notez que nous définissons DEBIAN_FRONTEND=noninteractive avant l'appel à apt-get
# install car sinon nous serions invités à sélectionner un fuseau horaire lorsque
# le paquet tzdata est inclus en tant que dépendance.
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y    \
    gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential \
    chrpath socat cpio python3 python3-pip python3-pexpect xz-utils        \
    debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa       \
    libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev sudo

# Ajouter un utilisateur et le configurer pour un sudo sans mot de passe. Nous utilisons le même utilisateur
# ID et des numéros de groupe que le système hôte. Cela nous permet de donner à l'utilisateur yocto
# la propriété des fichiers et répertoires dans le volume poky que nous allons ajouter
# sans avoir besoin de changer la propriété qui affecterait également le système hôte.
RUN groupadd -g $user_gid yoctouser
RUN useradd -m yoctouser -u $user_id -g $user_gid
    #echo "yoctouser ALL=(ALL:ALL) NOPASSWD:ALL" | tee -a /etc/sudoers

USER yoctouser
WORKDIR /home/yoctouser

ENV LANG=en_US.UTF-8

CMD /bin/bash

La commande useradd est bloquée, et plus spécifiquement l'option -u est le problème. Si je supprime -u $user_id, tout fonctionne bien. De plus, Docker remplit mon disque. /var/lib/docker/overlay2/ passe de 852MB avant l'ajout de l'option -u à des gigaoctets après quelques secondes seulement. Si je ne le tue pas, il remplit entièrement mon disque et je dois arrêter le démon Docker et supprimer manuellement les dossiers à l'intérieur du répertoire overlay2.

Pourquoi spécifier cet uid pourrait poser problème ?

Voici la section pertinente d'un script en Python que j'ai écrit pour piloter cela afin que vous puissiez voir comment j'obtiens l'identifiant d'utilisateur et le transmets à docker build.

def build_docker_image():
    print("Construction d'une image docker nommée:", DOCKER_IMAGE_NAME)
    USERID_ARG  = "user_id=" + str(os.getuid())
    USERGID_ARG = "user_gid=" + str(os.getgid())
    print(USERID_ARG)
    print(USERGID_ARG)
    try:
        subprocess.check_call(['docker', 'build',
                               '--build-arg', USERID_ARG,
                               '--build-arg', USERGID_ARG,
                               '-t', DOCKER_IMAGE_NAME, '.',
                               '-f', DOCKERFILE_NAME])
    except:
        print("Impossible de créer l'image docker")
        sys.exit(1)

Pour information, sur mon système

user_id=1666422094
user_gid=1666400513

Je fais tourner Docker version 20.10.5, build 55c4c88 sur un hôte Ubuntu 18.04.

2voto

Nick Points 690

J'ai besoin d'utiliser l'option -l / --no-log-init lors de l'appel de useradd pour contourner un bug dans docker relatif à la façon dont les grands UIDs sont gérés.

Mon dockerfile final ressemble à

FROM ubuntu:18.04

ARG user_id
ARG user_gid

# Paquets essentiels pour la construction sur un hôte Ubuntu
# https://docs.yoctoproject.org/ref-manual/system-requirements.html#ubuntu-and-debian
# Remarque, nous définissons DEBIAN_FRONTEND=noninteractive avant l'appel à apt-get
# installer car sinon on nous demandera de choisir un fuseau horaire lorsque le
# paquet tzdata est inclus en tant que dépendance.
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y    \
    gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential \
    chrpath socat cpio python3 python3-pip python3-pexpect xz-utils        \
    debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa       \
    libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev

# Configuration des locales
RUN apt-get install -y locales
RUN dpkg-reconfigure locales && \
    locale-gen en_US.UTF-8 &&   \
    update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US.UTF-8

# Ajout d'un utilisateur et configuration pour un sudo sans mot de passe. Nous utilisons le même ID utilisateur et les mêmes numéros de groupe que le système hôte. Cela nous permet de donner à l'utilisateur yocto la propriété des fichiers et répertoires dans le montage poky que nous allons ajouter sans avoir à changer la propriété qui affecterait également le système hôte. Notez l'utilisation de l'option --no-log-init pour useradd. Il s'agit d'un contournement pour un [bug](https://github.com/moby/moby/issues/5419) concernant la façon dont les grands UIDs sont gérés.
RUN apt-get install -y sudo &&                                           \
    groupadd --gid ${user_gid} yoctouser &&                              \
    useradd --create-home --no-log-init --uid ${user_id} --gid yoctouser \
        yoctouser &&                                                     \
    echo "yoctouser ALL=(ALL:ALL) NOPASSWD:ALL" | tee -a /etc/sudoers

USER yoctouser
WORKDIR /home/yoctouser

CMD ["/bin/bash"]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X