将主机系统的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éphaneGraber(超级棒的主要LXD开发人员)所写的this article(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容器上进行了测试
答案 0 :(得分: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的帮助。