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?
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:
named volumes
).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.
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.
Essayez l'une des solutions suivantes:
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
Essayez d'exécuter en utilisant explicitement la racine utilisateur
docker exec -it -u root [container] bash