web-dev-qa-db-fra.com

Comment donner à un utilisateur non root dans le conteneur Docker l'accès à un volume monté sur l'hôte

J'exécute mon application dans un conteneur Docker en tant qu'utilisateur non root. Je l'ai fait car c'est l'une des meilleures pratiques. Cependant, lors de l'exécution du conteneur, je monte un volume hôte sur celui-ci -v /some/folder:/some/folder. Je fais cela parce que mon application s'exécutant à l'intérieur du conteneur Docker doit écrire des fichiers dans le dossier Host monté. Mais comme j'exécute mon application en tant qu'utilisateur non root, elle n'a pas la permission d'écrire dans ce dossier

Question

Est-il possible de donner à un utilisateur non root dans un conteneur Docker un accès au volume hébergé?

Sinon, ma seule option est-elle d'exécuter le processus dans le conteneur Docker en tant que root?

15
Anthony

Il n'y a pas de solution magique ici: les autorisations à l'intérieur de Docker sont gérées de la même manière que les autorisations sans Docker. Vous devez exécuter les commandes chown et chmod appropriées pour modifier les autorisations du répertoire.

Une solution consiste à exécuter votre conteneur en tant que root et à utiliser un script ENTRYPOINT pour apporter les modifications d’autorisation appropriées, puis votre CMD en tant qu’utilisateur non privilégié. Par exemple, mettez ce qui suit dans entrypoint.sh:

#!/bin/sh

chown -R appuser:appgroup /path/to/volume
exec runuser -u appuser "$@"

Cela suppose que vous disposez de la commande runuser. Vous pouvez accomplir à peu près la même chose en utilisant Sudo à la place.

Utilisez le script ci-dessus en incluant une directive ENTRYPOINT dans votre Dockerfile:

FROM baseimage

COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/bin/sh", "entrypoint.sh"]
CMD ["/usr/bin/myapp"]

Cela démarrera le conteneur avec:

/bin/sh entrypoint.sh /usr/bin/myapp

Le script du point d’entrée apportera les modifications d’autorisations requises, puis exécutera /usr/bin/myapp comme appuser.

15
larsks

Il y aura une erreur si l'hôte env n'a pas appuser ou appgroup, il vaut donc mieux utiliser un ID utilisateur au lieu du nom d'utilisateur:

à l'intérieur de votre conteneur, exécutez

appuser$ id

Cela montrera:

uid = 1000 (appuser) gid = 1000 (appuser) groups = 1000 (appuser)

Depuis l'hôte env, exécutez:

mkdir -p /some/folder
chown -R 1000:1000 /some/folder
docker run -v /some/folder:/some/folder [your_container]

à l'intérieur de votre conteneur, vérifiez

ls -lh

pour voir le nom de l'utilisateur et du groupe, si ce n'est pas root, alors cela devrait fonctionner.

6
James Yang