J'ai utilisé docker-compose up
avec ce qui suit docker-compose.yml
version: '3.5'
services:
mysql-server:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root_pwd
volumes:
- ./var/lib/mysql:/var/lib/mysql:rw
Le répertoire ./var/lib/mysql
n'existe pas initialement.
Après avoir exécuté docker-compose up
..
ls -al ./var/lib/mysql
commande affiche tous les fichiers avec user:group
999:999
.
Je ne trouve pas d'utilisateur ou de groupe appelé 999
dans mon système.
Pourquoidocker-compose
choisit de créer des fichiers avec un id non existant: gid?
Dans mon cas, je ne peux pas valider le répertoire spécifique sauf si je change de propriétaire. Mais même quand je le fais, lors d'une prochaine manche, docker-compose up
met à nouveau la propriété à 999:999
.
Quelle est la solution au problème ci-dessus? par exemple. Existe-t-il un moyen de demander à docker-compose de mapper des fichiers dans la machine hôte avec une paire uid: gid spécifique?
Hôte: ubuntu-18.04
docker-compose: 1.22.0
Docker crée et remplit le répertoire avec l'utilisateur que mysql
image utilise. Cet utilisateur, bien sûr, a un uid
dans le conteneur. Ce uid
se trouve être 999.
L'utilisateur avec ce uid
existe dans le conteneur mais n'existe pas dans votre hôte.
Sur le conteneur, le dossier ressemble à ceci:
root@f86ffddac96c:/var/lib# ls -l
total 32
...
drwxr-xr-x 5 mysql mysql 4096 Mar 19 13:06 mysql
...
et sur l'hôte, cela finit par ressembler à ceci.
root@machine:/home/username/mysql/var/lib# ls -l
total 4
drwxr-xr-x 5 999 docker 4096 Mar 19 15:06 mysql
Cela signifie simplement que l'utilisateur mysql
a uid
de 999. Et lorsque vous créez un volume de liaison du conteneur vers l'hôte, tous les fichiers de ce volume doivent avoir les mêmes autorisations pour le même uid
s. Sur ma machine de test, docker a guid
de 999, c'est pourquoi il est affiché comme tel du côté de l'hôte.
En ce qui concerne la "correction" de ceci, vous pouvez soit utiliser un (niveau hôte) connu uid
dans le dockerfile au lieu de celui par défaut, ou vous pouvez simplement l'ignorer, car il fonctionne exactement comme prévu, sauf s'il y a un raison spécifique pour laquelle vous souhaitez qu'il affiche un certain nom pour un certain uid
dans votre système hôte.
Notre Dockerfile a des lignes comme
ARG uid=1000
ARG gid=1000
RUN groupadd -g $gid myuser && useradd -lm -u $uid -g $gid myuser
USER myuser
Ensuite, nous construisons avec
docker-compose build --build-arg uid=`id -u` --build-arg gid=`id -g` mydocker
Pour que l'uid et le gid de l'utilisateur créé à l'intérieur du Docker soient les mêmes que l'uid et le gid de l'utilisateur exécutant docker-compose en dehors du Docker.
Voici les fichiers sur lesquels votre image docker est construite: https://github.com/docker-library/mysql/tree/bb7ea52db4e12d3fb526450d22382d5cd8cd41ca/5.7
Dans le Dockerfile, vous pouvez lire:
RUN groupadd -r mysql && useradd -r -g mysql mysql
ce qui crée un utilisateur qui pourrait avoir le couple UID/GID que vous voyez.
Et dans le fichier entrypoint.sh, il y a:
chown -R mysql:mysql "$DATADIR"
qui est exécutée chaque fois que vous run
le conteneur.
Pour être sûr, essayez:
docker run exec -ti <nameOfContainer|containerHash> bash -c "id mysql"
Je peux suggérer une solution;
version: '3.5'
services:
mysql-server:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=root_pwd
volumes:
- ./var/lib/mysql:/var/lib/mysql:rw
entrypoint: chmod -R 755 /var && tail -f /dev/null
Ajout du point d'entrée dans le docker-compose.yaml
fichier pour effectuer les modifications d'autorisation récursives pour vous lorsque vous exécutez docker compose
(changez le répertoire selon vos besoins)