Почему docker-compose создает каталоги / файлы с пользователем: группа 999: 999? - PullRequest
3 голосов
/ 19 марта 2019

Я использовал docker-compose up со следующими 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

Каталог ./var/lib/mysql изначально не существует.

После запуска docker-compose up ..

ls -al ./var/lib/mysql команда показывает все файлы с user:group 999:999.

Я не могу найти пользователя или группу с именем 999 в моей системе.

Почему docker-compose выбирает создавать файлы с несуществующим uid: gid ?

В моем случаеЯ не могу зафиксировать конкретный каталог, пока не поменяю владельца.Но даже когда я это делаю, при следующем запуске docker-compose up снова обновляет владельца до 999:999.

Каково решение вышеупомянутой проблемы?Например, есть ли способ указать docker-compose для сопоставления файлов на хост-машине с определенной парой uid: gid?

Хост: ubuntu-18.04
docker-compose: 1.22.0

Ответы [ 4 ]

2 голосов
/ 19 марта 2019

Docker создает и заполняет каталог пользователем, которого использует mysql image. Этот пользователь, конечно, имеет uid внутри контейнера. Это uid, случается, 999.

Пользователь с этим uid существует в контейнере, но не существует на вашем хосте.

На контейнере папка выглядит так:

root@f86ffddac96c:/var/lib# ls -l
total 32
...
drwxr-xr-x 5 mysql mysql 4096 Mar 19 13:06 mysql
...

и на хосте это выглядит так.

root@machine:/home/username/mysql/var/lib# ls -l
total 4
drwxr-xr-x 5 999 docker 4096 Mar 19 15:06 mysql

Это просто означает, что у пользователя mysql есть uid из 999. И так как вы создаете том связывания из контейнера в хост, все файлы в этом томе должны иметь одинаковые разрешения для одинаковых uid с. На моем тестовом компьютере Docker имеет guid из 999, поэтому он отображается так же на стороне хоста.

Что касается «исправления» этого, вы можете либо использовать (на уровне хоста) известный uid в файле docker вместо файла по умолчанию, либо вы можете просто проигнорировать его, поскольку он работает точно так, как задумано, если только нет конкретная причина, по которой вы хотите, чтобы в вашей хост-системе отображалось определенное имя для определенного uid.

1 голос
/ 19 марта 2019

В нашем Dockerfile есть строки вроде

ARG uid=1000
ARG gid=1000
RUN groupadd -g $gid myuser && useradd -lm -u $uid -g $gid myuser
USER myuser

Затем мы строим с помощью

docker-compose build --build-arg uid=`id -u` --build-arg gid=`id -g` mydocker

, чтобы uid и gid пользователя, созданные внутри Docker, были такими же, как uid иgid пользователя, запускающего docker-compose вне Docker.

0 голосов
/ 19 марта 2019

Вот файлы, на которых ваш образ докера построен: https://github.com/docker-library/mysql/tree/bb7ea52db4e12d3fb526450d22382d5cd8cd41ca/5.7

В Dockerfile вы можете прочитать:

RUN groupadd -r mysql && useradd -r -g mysql mysql

, который создает пользователя, который может иметь UID / GIDпара, которую вы видите.

А в файле entrypoint.sh есть:

chown -R mysql:mysql "$DATADIR"

, который выполняется каждый раз, когда вы run контейнер.

Дляобязательно попробуйте:

docker run exec -ti <nameOfContainer|containerHash> bash -c "id mysql"
0 голосов
/ 19 марта 2019

Я могу предложить исправление;

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

Добавление точки входа в файл docker-compose.yaml для внесения рекурсивных изменений прав доступа при запуске docker compose (измените каталог на то, что вам нужно)

...