J'ai eu un problème similaire lors du partage d'un point de montage nfs en tant que volume à l'aide de docker-compose. J'ai pu résoudre le problème avec :
docker-compose up --force-recreate
Même si vous avez trouvé le problème, cela peut aider quelqu'un d'autre.
Une autorisation refusée dans un conteneur pour un répertoire partagé peut être due au fait que ce répertoire partagé est stocké sur un appareil. Par défaut, les conteneurs ne peuvent accéder à aucun appareil. Ajout de l'option $docker run --privileged
permet au conteneur d'accéder à tous périphériques et effectue des appels Kernel. Ceci n'est pas considéré comme sécurisé.
Une façon plus propre de partager un appareil consiste à utiliser l'option docker run --device=/dev/sdb
(si /dev/sdb
est l'appareil que vous souhaitez partager).
À partir de la page de manuel :
--device=[] Add a host device to the container (e.g. --device=/dev/sdc:/dev/xvdc:rwm) --privileged=true|false Give extended privileges to this container. The default is false. By default, Docker containers are “unprivileged” (=false) and cannot, for example, run a Docker daemon inside the Docker container. This is because by default a container is not allowed to access any devices. A “privileged” container is given access to all devices. When the operator executes docker run --privileged, Docker will enable access to all devices on the host as well as set some configuration in AppArmor to allow the container nearly all the same access to the host as processes running outside of a container on the host.
J'ai reçu une réponse d'un commentaire sous :Pourquoi le conteneur Docker invite-t-il l'autorisation refusée ?
man docker-run
donne la bonne réponse :
Les systèmes d'étiquetage comme SELinux exigent que les étiquettes appropriées soient placées sur le contenu du volume monté dans un conteneur. Sans étiquette, le système de sécurité peut empêcher les processus exécutés à l'intérieur du conteneur d'utiliser le contenu. Par défaut, Docker ne modifie pas les étiquettes définies par le système d'exploitation.
Pour modifier une étiquette dans le contexte du conteneur, vous pouvez ajouter l'un des deux suffixes :z ou :Z au montage du volume. Ces suffixes indiquent à Docker de réétiqueter les objets de fichier sur les volumes partagés. L'option z indique à Docker que deux conteneurs partagent le contenu du volume. Par conséquent, Docker étiquette le contenu avec une étiquette de contenu partagé. Les étiquettes de volume partagé permettent à tous les conteneurs de lire/écrire du contenu. L'option Z indique à Docker d'étiqueter le contenu avec une étiquette privée non partagée. Seul le conteneur actuel peut utiliser un volume privé.
Par exemple :
docker run -it --name oracle_install -v /root/database:/tmp/install/database:z ...
Une autre raison est une non-concordance avec l'UID/GID. Cela se traduit souvent par la possibilité de modifier un montage en tant que root mais pas en tant qu'utilisateur de conteneurs
Vous pouvez définir l'UID, donc pour un conteneur ubuntu fonctionnant sous ubuntu, vous devrez peut-être ajouter :uid=1000
(vérifier avec id -u
) ou définissez l'UID localement en fonction de votre cas d'utilisation.
uid=valeur et gid=valeur
Définissez le propriétaire et le groupe des fichiers dans le système de fichiers (par défaut :uid=gid=0)
Il y a un bon blog à ce sujet ici avec cet exemple tmpfs
docker run \
--rm \
--read-only \
--tmpfs=/var/run/prosody:uid=100 \
-it learning/tmpfs
http://www.dendeer.com/post/docker-tmpfs/