web-dev-qa-db-fra.com

Pourquoi docker-compose crée des répertoires / fichiers avec l'utilisateur: groupe 999: 999?

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:group999: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

9
Marinos An

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 uids. 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.

5
Christian W.

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.

2
RemcoGerlich

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"
0
Louis Delfieux

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)

0
Nordle