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?
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
.
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.