如何在不运行容器的情况下确定 UID?

问题描述

我正在 Centos 8 上使用 podman 运行 docker.io/library/mariadb:latest 映像。我正在主机上安装一个卷以用于数据库的持久存储。我了解容器内的用户必须更改主机上的目录所有权才能获得 rw 访问权限。因此,我们为此使用 podman 的 unshare 命令。 mariadb 中的用户称为 mysql。如果我们输入

podman unshare chown mysql:mysql /path/to/host

这会出错:

chown: invalid user: ‘mysql:mysql’

这是有道理的,因为主机上不存在 mysql 用户。我们必须为此提供 UID。这个信息通常是从一个正在运行的容器中获取,并在 /etc/passwd

中查找 mysql
 podman run docker.io/library/mariadb grep mysql /etc/passwd

从下面的输出中,UID/GID 是 999:999。

mysql:x:999:999::/home/mysql:/bin/sh

现在我们可以使用主机上的 UID 进行 chown

podman unshare chown 999:999 /path/to/host

这行得通。

但是,我们如何在不运行容器的情况下获取这些信息?

我检查了图像,但找不到指定的显式 UID:GID。 提出这个问题的原因是实现基础架构的自动化配置/设置,而无需担心手动步骤。

解决方法

处理这种情况的最简单方法是使用命名卷,而不是绑定安装。例如,如果我们运行...

podman run -it --rm -v mariadb_data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret  mariadb:latest 

...然后容器将启动而不会出现任何错误。这种形式的 -v 选项会导致 podman 创建一个命名卷,而不是像绑定挂载那样使用特定的现有主机目录。

挂载命名卷时,卷的所有权设置为运行主容器进程的 UID,因此默认情况下它具有正确的权限。

这为您提供了使用绑定挂载的几乎所有优点——也就是说,数据库数据在容器文件系统之外维护,即使容器被删除也会持续存在——而无需考虑权限。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...