将主机系统的mysql/mariadb数据目录共享到容器并正确Map权限的正确方法是什么?我已经为此挣扎了好几天了。如果以前有人问过这个问题,我很抱歉,但是我已经彻底搜索过了,还没有找到解决办法。基本上我已经做到了:
在主机和容器上安装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
不幸的是,这会破坏容器并阻止它启动,因为不允许Map。
$ 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/)作者:stéphane graber(超级棒的主要lxd开发人员)来实现这一点。我承认我不完全明白这里发生了什么,如果有人能帮我更好地理解我的错误,我会非常感激的。我有一种感觉,我的范围错了(1000?)。我以前也尝试过手动添加mysql用户/组并尝试Map这些用户/组(而不是安装mysql),但也没有成功(同样的错误)。这是我在尝试Map之前尝试的):
$ sudo groupadd mysql
$ sudo useradd -r -g mysql mysql
我使用的是运行在主机ubuntu18.04amd64上的lxd3.0.1,并使用ubuntu18.04amd64容器进行测试
1条答案
按热度按时间r9f1avp51#
原来这真是个“新手”问题。我上周刚开始使用lxd,所以似乎我不知道一些基本原则。我现在觉得自己很蠢,但是嘿。。。有时候你就是这样学的对吧?
对于任何遇到这个问题的人。。。最实用的解决方案是将容器提升为专用容器:
lxc config set cname security.privileged true
之后重新启动容器。这样就不需要手动Map用户。一切正常。在使用之前,您可能需要从容器中取出食物:chown -Rv mysql:mysql /var/lib/mysql
当您共享/var/lib/mysql并在容器中运行数据库服务器时,请注意主机上的任何mysql/mariadb服务器都没有运行。否则锁将阻止容器的服务器示例运行。不应尝试解除锁定并同时运行服务器,因为这只会损坏数据。我也不推荐这种生产方法。我这样做只是为了在我的开发环境中简化测试,所以数据是可消耗的。我确信还有其他的实际用例。这种方法可以有效地在主机/容器之间共享mysql数据目录,但显然在任何给定的时间只有一个运行的服务器可以使用这些数据。
非常感谢大卫青睐的lxd邮件列表的帮助。