web-dev-qa-db-fra.com

Modifier les autorisations de fichier dans le dossier monté à l'intérieur du conteneur Docker sur l'hôte Windows

Clause de non-responsabilité/Modifier 2

Quelques années plus tard, pour tous ceux qui lisent cette question - Si vous êtes sous Windows et que vous souhaitez utiliser Docker avec des conteneurs Linux, je vous recommande fortement de ne pas utiliser du tout Docker pour Windows et de plutôt démarrer l'ensemble de l'environnement Docker dans un VM tout à fait. Ce problème Ext3 NTFS vous cassera le cou à tellement de niveaux différents que l'installation de docker-machine ne vaut même pas la peine.


Modifier:

J'utilise docker-machine qui démarre une instance de boot2docker dans une Virtualbox VM avec un dossier partagé sur/c/Users à partir duquel vous pouvez monter des volumes dans vos conteneurs. Les autorisations desdits volumes sont celles la question est sur le point. Les machines virtuelles sont stockées sous /c/Users/tom/.docker/

J'ai choisi d'utiliser le docker-machine Flux de travail Virtualbox sur Hyper-V parce que j'ai besoin de VBox dans mon flux de travail quotidien et que l'exécution simultanée d'Hyper-V et de Virtualbox sur un seul système n'est pas possible en raison des incompabilités entre les différents hyperviseurs.

Question d'origine

J'essaie actuellement de configurer PHPMyAdmin dans un conteneur sur Windows, mais je ne peux pas modifier les autorisations de config.inc.php fichier.

J'ai trouvé: Impossible d'appeler chown dans le conteneur Docker (Docker pour Windows) et j'ai pensé que cela pourrait être quelque peu lié, mais il semble ne s'appliquer qu'à MongoDB.

Ceci est mon docker-compose.yml

    version: "3"

    services:
      pma:
        image: (secrect company registry)/phpmyadmin
        ports: 
          - 9090:80
        volumes:
          - /c/Users/tom/projects/myproject/data/var/www/public/config.inc.php:/var/www/public/config.inc.php

maintenant, quand je docker exec -it [container] bash et changer dans le répertoire monté, j'essaye d'exécuter chmod sur le config.inc.php mais pour une raison quelconque, il échoue en silence .

root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php
root@22a4bag43245: chmod 655 config.inc.php
root@22a4bag43245: ls -la config.inc.php
-rw------- 1 root root 0 Aug 11 15:11 config.inc.php

Compte tenu de la réponse liée, je pensais que je pouvais simplement déplacer le volume hors de mon Userhome, mais vbox ne monte pas du tout le dossier.

Comment modifier les autorisations de fichier de /var/www/public/config.inc.php de façon persistante?

6
Tom M

J'ai eu le même problème de ne pas pouvoir changer de propriétaire même après avoir utilisé chown. Et comme je recherché , c'était à cause des volumes NTFS montés à l'intérieur du système de fichiers ext. J'ai donc utilisé une autre approche.

Les volumes internes à docker sont exempts de ces problèmes. Vous pouvez donc monter votre fichier sur le volume de docker interne, puis créer un lien symbolique dur vers ce fichier dans votre dossier local où vous le souhaitez:

Sudo ln $(docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>) <absolute_path_of_destination>

De cette façon, vous pouvez avoir vos fichiers à l'endroit souhaité, dans le docker et sans aucun problème d'autorisation, et vous pourrez modifier le contenu du fichier comme dans le montage de volume normal en raison d'un lien symbolique dur.

Ici est une implémentation fonctionnelle de ce processus qui monte et relie un répertoire. Si vous souhaitez connaître les détails, consultez possible fix section dans issue .

[~ # ~] modifier [~ # ~]

Étapes pour mettre en œuvre cette approche:

  1. Montez le fichier concerné dans le docker-volume interne (également appelé named volumes).
  2. Avant de créer un lien physique, assurez-vous que les volumes et le fichier concerné y sont présents. Pour vous en assurer, vous devez avoir exécuté votre conteneur au moins une fois avant ou si vous souhaitez automatiser cette création de fichier, vous pouvez inclure une exécution de docker qui crée les fichiers requis et se ferme.

    docker run --rm -itd \ -v "<Project_name>_<volume_name>:/absolute/path" \ <image> bash -c "touch /absolute/path/<my_file>"

Cette exécution de docker créera des volumes et des fichiers requis. Ici, container est le nom de mon projet, par défaut, c'est le nom du dossier dans lequel le projet est présent et <volume_name> est le même que celui que nous voulons utiliser dans notre conteneur d'origine. <image> peut être le même qui est déjà utilisé dans vos conteneurs d'origine.

  1. Créez un lien physique dans votre système d'exploitation vers l'emplacement réel du fichier sur votre système. Vous pouvez trouver l'emplacement du fichier à l'aide de docker volume inspect --format '{{ .Mountpoint }}' <project_name>_<volume_name>/<my_file>. Les utilisateurs Linux peuvent utiliser ln dans le terminal et les utilisateurs Windows peuvent utiliser mklink dans l'invite de commandes.

À l'étape 3, nous n'avons pas utilisé /absolute/path depuis le <volume_name> fait déjà référence à cet emplacement, et il nous suffit de nous référer au fichier.

9
Ayushya

Essayez l'une des solutions suivantes:

  1. Si vous pouvez reconstruire l'image de l'image: image: (secrect company registry)/docker-stretchimal-Apache2-php7-pma puis à l'intérieur du fichier docker, ajoutez ce qui suit

    USER root RUN chmod 655 config.inc.php

Ensuite, vous pouvez reconstruire l'image et la pousser dans le registre, et ce que vous faisiez devrait fonctionner. Cela devrait être votre solution préférée, car vous ne voulez pas modifier manuellement les autorisations chaque fois que vous démarrez un nouveau conteneur

  1. Essayez d'exécuter en utilisant explicitement la racine utilisateur

    docker exec -it -u root [container] bash

3
yamenk