1

将主机系统的 mysql/mariadb 数据目录共享到容器并正确映射权限的正确方法是什么?我已经为此苦苦挣扎了几天。如果之前有人问过这个问题,我很抱歉,但我已经彻底搜索过,但还没有找到解决方案。基本上我到目前为止所做的:

在主机和容器上安装 mariadb-server 并:

$ 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"

我基本上是按照Stéphane Graber(超级棒的主要 LXD 开发人员)撰写的这篇文章https://stgraber.org/2017/06/15/custom-user-mappings-in-lxd-containers/)来实现这一点. 我承认我并不完全理解这里发生了什么,如果有人可以帮助我更好地理解我的错误,我将非常感激。我感觉我的范围错了(1000?)。我以前尝试通过手动添加 mysql 用户/组并尝试映射它们(而不是安装 mysql)来做同样的事情,但这也没有成功(同样的错误)。这是我在尝试映射之前尝试过的):

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

我正在使用在主机 Ubuntu 18.04 amd64 上运行的 LXD 3.0.1 并使用 Ubuntu 18.04 amd64 容器进行测试

4

1 回答 1

0

事实证明,这是一个真正的“新手”问题。我上周刚开始使用 LXD,所以我似乎不知道一些基本原则。我现在觉得自己很蠢,但是嘿……你有时就是这样学习的,对吧?

对于遇到此问题的其他任何人......最实用的解决方案是将容器提升为特权容器:

lxc config set cname security.privileged true

之后重新启动容器。这样您就不需要手动映射用户了。一切都应该正常工作。不过,您可能必须在使用前从容器中取出:

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

当您共享 /var/lib/mysql 并在容器中运行数据库服务器时,请注意主机上的任何 mysql/mariadb 服务器都没有运行。否则锁会阻止容器的服务器实例运行。不应该尝试破解锁并同时运行服务器,因为这只会破坏数据。

我也不建议将这种方法用于生产。我这样做只是为了简化对我的开发环境的测试,因此数据是可消耗的。我相信还有其他实际用例。这种方法可以有效地在主机/容器之间共享 mysql 数据目录,但显然只有一个正在运行的服务器可以在任何给定时间使用数据。

非常感谢 LXD 邮件列表中的 David Favor 提供的帮助。

于 2018-07-12T15:58:15.973 回答