web-dev-qa-db-fra.com

Exécution de Docker sur Ubuntu: le volume hôte monté n'est pas accessible en écriture à partir du conteneur

Docker fonctionne très bien sur un Mac pour moi, mais je dois exécuter Docker Host à l'intérieur d'une VirtualBox (ou Parallels ou VMWare Fusion), car le noyau de Mac ne prend pas en charge Docker.

J'ai donc essayé de configurer mon application et un docker-compose sur un bureau Ubuntu - nativement, où le client docker et l'hôte docker s'exécutent physiquement sur le même système. Cela a fonctionné, mais mes conteneurs Docker en cours d'exécution ne peuvent pas écrire dans un volume hôte monté.

J'utilise docker-compose avec les paramètres suivants:

volumes:
   - ./api:/usr/src/app

Je monte donc le répertoire "api" de l'hôte Ubuntu OS dans le conteneur Docker sous/usr/src/app.

docker inspect <container ID> montre que le volume est accessible en écriture

"Destination": "/usr/src/app",
"Mode": "rw",
"RW": true

Mais ce n'est pas le cas: je reçois permission denied lorsque j'essaie de créer un répertoire ou de modifier un fichier à partir du conteneur Docker.

J'ai recherché ce problème sur Google, bien sûr, et je suis tombé sur quelques problèmes SELinux de CentOS/RHEL, mais j'utilise Ubuntu 15.10, édition 64 bits, pas CentOS.

16
Alex Kovshovik

Si votre uid sur l'hôte (id -u) n'est pas le même que le uid de l'utilisateur dans le conteneur docker (souvent "docker") alors vous pouvez avoir ce problème. Tu peux essayer:

  1. Rendre les UID identiques entre votre utilisateur et l'utilisateur dans le conteneur Docker.
  2. Définition des autorisations de groupe sur le répertoire en écriture pour un groupe auquel vous et Docker appartenez.
  3. Vous pouvez également utiliser l'option nucléaire:

chmod a+rwx -R project-dir/

L'option nucléaire rendra votre espace de travail git sale, ce qui vous ennuiera énormément, ce n'est donc pas la meilleure solution à long terme. Il arrête le saignement.

Pour mieux comprendre le problème, vous trouverez peut-être ces informations utiles:

  1. https://github.com/docker/docker/issues/7906
  2. https://github.com/docker/docker/issues/7198
22
Freedom_Ben

Depuis la version 1.7 de Docker, vous avez la possibilité de monter un répertoire Host avec des autorisations sur un conteneur en utilisant les indicateurs: Z ou: z comme ceci:

docker run -v ./api:/usr/src/app:Z
  • : z - ajoutera des autorisations à tous les conteneurs en utilisant l'étiquette 'svirt_sandbox_file_t'
  • : Z - ajoutera des autorisations uniquement à l'étiquette de conteneur actuelle

À partir de docker-compose v1.4.0, vous pouvez l'utiliser dans docker compose comme ceci:

volumes:
   - ./api:/usr/src/app:Z

Bien que je devrais ajouter, j'ai encore quelques problèmes avec cela (voir Ajout d'autorisations au répertoire hôte avec docker-compose ).

Références:

L'utilisation de volumes avec Docker peut provoquer des problèmes avec SELinux - http://www.projectatomic.io/blog/2015/06/using-volumes-with-docker-can-cause-problems-with-selinux/ =

Guide de l'utilisateur Docker - https://docs.docker.com/engine/userguide/dockervolumes/#volume-labels

Notes de publication Docker-compose pour v1.4.0 - https://github.com/docker/compose/releases/tag/1.4.

21
Avi Farada