LXD разделяет /var/lib/mysql с хоста на контейнер и отображает пользователя / группу

Как правильно передать каталог данных mysql/mariadb хост-системы в контейнер и правильно сопоставить разрешения? Я боролся с этим в течение нескольких дней. Извините, если этот вопрос задавался ранее, но я тщательно искал и пока не смог найти решение. В основном то, что я сделал до сих пор:

Установите mariadb-сервер на хост и контейнер и:

$ printf "lxd:$(id -u mysql):1\nroot:$(id -u mysql):1\n" | sudo tee -a /etc/subuid
$ printf "lxd:$(id -g mysql):1\nroot:$(id -g mysql):1\n" | sudo tee -a /etc/subgid
$ sudo systemctl restart lxd
$ printf "uid $(id -u mysql) 1000\ngid $(id -g mysql) 1000" | lxc config set $CONTAINER_NAME raw.idmap -
$ lxc restart $CONTAINER_NAME
$ sudo lxc config device add $CONTAINER_NAME mysql disk source=/var/lib/mysql path=/var/lib/mysql

К сожалению, это разрывает контейнер и препятствует его запуску, поскольку сопоставление не разрешено.

$ sudo lxc info --show-log ub1804x64-3

Name: ub1804x64-3
Remote: unix://
Architecture: x86_64
Created: 2018/07/09 15:30 UTC
Status: Stopped
Type: persistent
Profiles: default

Log:

lxc ub1804x64-3 20180709154554.682 ERROR    lxc_conf - conf.c:lxc_map_ids:2919 - newuidmap failed to write mapping "newuidmap: uid range [1000-1001) -> [114-115) not allowed": newuidmap 6725 0 100000 1000 1000 114 1 1001 101001 64535
lxc ub1804x64-3 20180709154554.682 ERROR    lxc_start - start.c:lxc_spawn:1661 - Failed to set up id mapping.
lxc ub1804x64-3 20180709154554.755 WARN     lxc_network - network.c:lxc_delete_network_priv:2607 - Failed to remove interface "veth38DOB9" from "lxdbr0": Invalid argument
lxc ub1804x64-3 20180709154554.755 ERROR    lxc_container - lxccontainer.c:wait_on_daemonized_start:834 - Received container state "ABORTING" instead of "RUNNING"
lxc ub1804x64-3 20180709154554.756 ERROR    lxc_start - start.c:__lxc_start:1887 - Failed to spawn container "ub1804x64-3"
lxc 20180709154554.775 WARN     lxc_commands - commands.c:lxc_cmd_rsp_recv:130 - Connection reset by peer - Failed to receive response for command "get_state"

Я в основном следую за этой статьей ( https://stgraber.org/2017/06/15/custom-user-mappings-in-lxd-containers/), написанной Стефаном Грабером (первоклассным разработчиком LXD) для достижения этой цели., Я признаю, что я не до конца понимаю, что здесь происходит, если бы кто-то мог помочь мне немного лучше понять мою ошибку, я был бы очень признателен. У меня ощущение, что у меня неправильный диапазон (1000?). Ранее я пытался сделать то же самое, вручную добавив пользователя / группу mysql и пытаясь отобразить их (вместо установки mysql), но это также не сработало (та же ошибка). Это то, что я пробовал, прежде чем пытаться сопоставления):

$ sudo groupadd mysql
$ sudo useradd -r -g mysql mysql

Я использую LXD 3.0.1 на хосте Ubuntu 18.04 amd64 и тестирую с контейнером Ubuntu 18.04 amd64

1 ответ

Вот и получается, что это был действительно "новенький" вопрос. Я только начал использовать LXD на прошлой неделе, так что, похоже, я не знал о нескольких основных принципах. Теперь я чувствую себя глупо, но эй... так ты иногда учишься, верно?

Для всех, кто сталкивался с этой проблемой... наиболее практичным решением было поднять контейнер в привилегированный контейнер:

lxc config set cname security.privileged true

Перезапустите контейнер после этого. Тогда вам не нужно будет отображать пользователей вручную. Все должно работать нормально. Возможно, вам придется съесть из контейнера перед использованием, хотя:

chown -Rv mysql:mysql /var/lib/mysql

Будьте осторожны, чтобы все серверы mysql / mariadb на хост-компьютере не работали, когда вы используете / var / lib / mysql и запускаете сервер базы данных в контейнере. В противном случае блокировка не позволит запустить экземпляр сервера контейнера. Не следует пытаться снять блокировку и запустить серверы одновременно, так как это приведет к повреждению данных.

Я бы не рекомендовал этот метод для производства. Я просто делаю это, чтобы упростить тестирование в моей среде разработки, поэтому данные можно использовать. Я уверен, что есть и другие случаи практического использования. Этот метод работает для эффективного разделения каталога данных mysql между хостом / контейнером, но очевидно, что только один работающий сервер может использовать данные в любой момент времени.

Большое спасибо Дэвиду Фавору из списка рассылки LXD за помощь.

Другие вопросы по тегам