我正在为我的开发环境运行一个Ubuntu20.04.5LTS虚拟机。在过去,我运行多个VM来托管数据库、web服务器等,因为我需要它们来执行项目。所以简单地说,我是个集装箱清洁工!
我想要做的是创建一个运行Podman容器的Ubuntu虚拟机。
我目前的拦截器是MySQL,或任何其他区域数据库。
如果我使用容器默认位置作为存储,那么每次启动容器时,我都需要加载一个新的数据库转储,因为存储本质上是短暂的。这显然是不理想的。
我读过许多用例,这些用例指定创建一个附加的或挂载的驱动器/目录来存储MySQL目录,以便在容器每次重新启动后数据不会消失。我没有发现的是如何正确地设置它。
同样,我的目标是将主机目录挂载为MySQL数据dir。
因此,首先,我创建了一个具有完全开放权限的共享数据位置:
echo "STATUS: Creating data directory for MySQL container"
sudo mkdir -p /opt/mysql/server/data
sudo chmod 777 /opt/mysql -R然后映射驱动器并指定数据目录:
echo "STATUS: Run container with mapped host drive"
podman run -d --replace --name=MySQL -h=mysql-pod -p=63306:3306 /
-v="/opt/mysql/server:/var/lib/mysql" docker.io/mysql/mysql-server:8.0 /
--basedir=/var/lib/mysql --datadir=/var/lib/mysql/data执行此命令将给我留下以下日志条目:
podman:/vagrant/podman$ podman logs MySQL
[Entrypoint] MySQL Docker Image 8.0.30-1.2.9-server
2022-09-14T23:03:17.922048Z 0 [ERROR] [MY-010338] [Server] Can't find error-message file '/var/lib/mysql/share/mysql-8.0/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
[Entrypoint] Initializing database
[Entrypoint] No password option specified for new database.
[Entrypoint] A random onetime password will be generated.
mysqld: Can't create/write to file '/var/lib/mysql/data/is_writable' (OS errno 13 - Permission denied)
2022-09-14T23:03:17.954340Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2022-09-14T23:03:17.954386Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.30) initializing of server in progress as process 12
2022-09-14T23:03:17.954403Z 0 [ERROR] [MY-010338] [Server] Can't find error-message file '/var/lib/mysql/share/mysql-8.0/errmsg.sys'. Check error-message file location and 'lc-messages-dir' configuration directive.
2022-09-14T23:03:17.954836Z 0 [ERROR] [MY-010460] [Server] --initialize specified but the data directory exists and is not writable. Aborting.
2022-09-14T23:03:17.954840Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/data/ is unusable. You can remove all files that the server added to it.
2022-09-14T23:03:17.954859Z 0 [ERROR] [MY-010119] [Server] Aborting
2022-09-14T23:03:17.954918Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.30) MySQL Community Server - GPL.我尝试了多个权限集,在主机上创建一个mysql用户,并赋予它目录所有权.还有很多其他的事情,因为我找不到一个很好的解释如何正确地做这件事。
同样,我是一个容器noob,所以我非常肯定我遗漏了一些关于共享资源权限的东西,但是我已经经历了上百次映射和权限迭代,并且没有在网上找到任何像Podman这样的非根OCI来解决这个问题的东西。
也许答案是,我必须执行Podman的根帐户,但我想,在我把笔记本电脑扔出窗外之前,我会向社区大声呼喊。
在Adv. .谢谢。
G.C
UnKulMunki
发布于 2022-09-15 00:24:06
如果我使用容器默认位置作为存储,那么每次启动容器时,我都需要加载一个新的数据库转储,因为存储本质上是短暂的。
确实,容器的主文件系统是短暂的,不应该将数据存储在那里。然而,这并不是存储的唯一选择。
容器运行时(如Docker和Podman )支持“卷”的概念--命名(或匿名)存储,由容器运行时管理,在它们运行时挂载在容器中,并且与容器文件系统分离。卷具有独立于关联容器的生存期。
所有主要数据库映像都已配置为将数据库数据存储在卷上。例如,如果在运行podman volume ls映像之前运行postgres:
$ podman volume ls然后启动(并停止)一个postgres容器:
$ podman run --rm -e POSTGRES_PASSWORD=secret docker.io/postgres:14然后再检查一次卷的列表:
$ podman volume ls
DRIVER VOLUME NAME
local 7b33982f61ec36601371803f9f4dcca66dc0a326cad1b2260ab30136b7ef6b40您将看到已经创建了一个卷,并且尽管容器已经被移除,它仍然存在。这是一个“匿名”卷:它没有被指定一个显式的名称,这意味着它并不特别有用(您可以使用那个长卷id来引用它,但这并不是您与卷交互的方式)。为了使管理更容易,您可以创建命名卷并使用它们。例如:
$ podman run --rm -v postgres_data:/var/lib/postgres -e POSTGRES_PASSWORD=secret postgres:14这将创建一个名为postgres_data的卷,并在容器中的适当点挂载它。如果停止容器,则可以创建一个具有相同卷参数的新容器,并且它将访问相同的数据:尽管运行了新的容器,数据库仍将继续提供相同的数据。
还可以创建“绑定挂载”--即将特定的主机目录挂载到容器中。当您将文件系统路径作为-v的第一个参数时,您就是这样做的,如下所示:
podman run -v "/opt/postgres/server:/var/lib/postgres" docker.io/postgres:14如果需要在主机和容器之间共享数据,这可能很有用,但是对于数据库这样的东西,底层存储实际上是一个“黑匣子”(通过数据库服务器访问它的唯一方式),卷通常更容易管理。
如果您想用podman使用绑定挂载来启动您的MySQL容器,您需要确保容器中的mysql用户可以写这个目录。
您创建了这样一个目录:
sudo mkdir -p /opt/mysql/server/data
sudo chmod 777 /opt/mysql -R这看起来应该可以工作,因为数据目录是全局可写的,但是有两个问题:
如果我们拥有数据目录,事情会更好:
sudo mkdir /opt/mysql
sudo chown $UID:$UID /opt/mysql
mkdir -p /opt/mysql/server/data
podman run -d --replace --name=MySQL -p 63306:3306 \
-v "/opt/mysql/server/data:/var/lib/mysql" \
docker.io/mysql/mysql-server:8.0如果我们运行selinux,则需要修改-v选项以包含:z限定符,如下所示:
-v "/opt/mysql/server/data:/var/lib/mysql:z" \通过使用主目录的子目录而不是在/opt下创建目录,我们可以简化一些事情:
mkdir -p $HOME/data/mysql
podman run -d --replace --name=MySQL -p 63306:3306 \
-v "$HOME/data/mysql:/var/lib/mysql:z" \
docker.io/mysql/mysql-server:8.0但是,正如我前面提到的那样,使用卷消除了大部分的混乱,因为容器运行时负责分配和管理存储:
podman run -d --replace --name=MySQL -p 63306:3306 \
-v mysql_data:/var/lib/mysql \
docker.io/mysql/mysql-server:8.0您可以在Docker的"码头数据管理“文档以及相关的"使用量”和"使用绑定挂载“文档中阅读更多有关这些主题的内容。这里的材料同样适用于波德曼。
https://serverfault.com/questions/1110764
复制相似问题