web-dev-qa-db-fra.com

Docker crée des fichiers en tant que root dans un volume monté

J'utilise Docker (1.3.1) pour construire des RPM à l'intérieur d'un conteneur:

docker run -v /home/matt/build:/build build-rpm /build/build-pkg.sh

Cela fonctionne très bien (mon utilisateur est dans le groupe docker, donc je n'ai pas besoin de Sudo) et supprime un .rpm fichier dans le répertoire courant. Le problème est que le fichier est créé comme appartenant à root.

Comment puis-je l'organiser pour que le fichier soit créé et appartient au même utilisateur que celui avec lequel j'exécute Docker?

27
Matt R

Vous pouvez essayer de créer (dans le Dockerfile d'une image personnalisée) un utilisateur et le définir comme celui utilisé par le conteneur

RUN adduser --system --group --Shell /bin/sh auser \
 && mkdir /home/auser/bin
USER auser

Vérifiez ensuite si un docker run -v /home/matt/build:/build build-rpm monte le dossier partagé dans/build en tant que auser.


Une autre option mentionnée dans problème 2259 :

Si vous chown le volume (côté hôte) avant de le monter par liaison, cela fonctionnera.
Dans ce cas, vous pourriez faire:

mkdir /tmp/www
chown 101:101 /tmp/www
docker run -v /tmp/www:/var/www ubuntu stat -c "%U %G" /var/www

(En admettant que 101:101 est le UID:GID du www-data utilisateur dans votre conteneur.)

5
VonC

Docker s'exécute en tant que root et n'a aucune idée de ce que votre utilisateur est dans son environnement virtuel (même si vous êtes dans le groupe sudoers). Mais vous pouvez créer un utilisateur non root tout en créant votre image docker qui peut être appelée comme vous le souhaitez.

# create a non-root user named tester, 
# give them the password "tester" put them in the Sudo group
RUN useradd -d /home/tester -m -s /bin/bash tester && echo "tester:tester" | chpasswd && adduser tester Sudo

# start working in the "tester" home directory
WORKDIR /home/tester
COPY ./src

# Make the files owned by tester
RUN chown -R tester:tester /home/tester

# Switch to your new user in the docker image
USER tester
1
Paul Oliver