Объемы и разрешения между хостом и контейнером докеров

Я пытаюсь докеризовать все службы на своем хост-компьютере. Но у меня возникают следующие проблемы с Docker и разрешениями на том между хостом и докером.

У меня есть хост-машина со следующей структурой папок:

- /data/mysql (user: docker-mysql)
- /data/gitlab (user: docker-gitlab)
- /data/backup (user: share-backup)

Папка /data/mysql:/mnt/mysql монтируется в контейнер докеров mysql. Контейнер docker mysql создает резервные копии каждые 24 часа, но поскольку контейнер docker запускается от имени пользователя root, эти резервные копии создаются как root пользователя и root root в папке / data / mysql.

Моя цель заключается в том, чтобы файлы в папке / data / mysql создавались от имени пользователя docker-mysql, а не от имени пользователя root.

Я попытался изменить пользователя контейнера докеров на другого пользователя, установив RUN groupadd -r docker-mysql && useradd -r -g docker-mysql docker-mysql и USER docker-mysql, но тогда контейнер mysql даже больше не запускается, потому что пользователь docker-mysql, похоже, не имеет прав root. Я также пробовал это на образе докера Gitlab-CE, но столкнулся с той же проблемой, что запуск Gitlab-CE от имени другого пользователя вызывает ошибки разрешения.

Есть идеи, как записывать файлы, например, на /data/mysql на хосте с правильным пользователем?


person Twoez    schedule 04.09.2019    source источник
comment
Какой образ mysql вы используете?   -  person Roberto Gonçalves    schedule 05.09.2019


Ответы (1)


Несмотря на ваш образ mysql, вам нужно: каждый процесс внутри вашего контейнера должен выполняться от имени пользователя без полномочий root. Для этого есть несколько обходных путей, но я предлагаю вам сначала погрузиться в свой базовый образ mysql и посмотреть, что происходит под капотом. Один из способов - перенаправлять каждый процесс пользователю без полномочий root. Этого можно добиться:

В вашем Dockerfile

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

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["mysqld"] ##CHECK YOUR IMAGE FIRST

Эти двое можно перевести как

docker-entrypoint.sh mysqld

Теперь на вашем docker-entrypoint.sh, который необходимо изменить, если образ не такой, как в этом примере (он был взят из mongodb, который использует ubuntu в качестве базового образа ОС ):

if [[ “$originalArgOne” == mysql* ]] && [ “$(id -u)” = ‘0’ ]; then
    if [ “$originalArgOne” = ‘mysqld’ ];
        then chown -R docker-mysql <MYSQL FOLDERS in CONTAINER>
    fi 
    # make sure we can write to stdout and stderr as “mongodb”
    # (for our “initdb” code later; see “ — logpath” below)
    chown --dereference docker-mysql “/proc/$$/fd/1” “/proc/$$/fd/2” || :
    exec gosu docker-mysql “$BASH_SOURCE” “$@”
fi

Этот ответ был адаптирован из здесь (Хорошее чтение)

person Roberto Gonçalves    schedule 04.09.2019