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.