如果没有 运行 容器,如何确定 UID?
How UID can be determined without running the container?
我是 运行 docker.io/library/mariadb:latest 映像,在 Centos 8 上使用 podman。我正在主机上安装一个卷用于数据库的持久存储。我知道必须更改主机上的目录所有权,容器内的用户才能获得 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 分配。
这个问题的原因是实现基础设施的自动化 provisioning/setup 而无需担心手动步骤。
处理这种情况的最简单方法是使用命名卷,而不是绑定安装。例如,如果我们 运行...
podman run -it --rm -v mariadb_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret mariadb:latest
...然后容器将正常启动。 -v
选项的这种形式导致 podman
创建一个 命名卷 ,而不是像我们使用绑定挂载那样使用特定的现有主机目录。
挂载命名卷时,卷的所有权设置为主容器进程所在的 UID 运行ning,因此默认情况下它具有正确的权限。
这几乎可以让您获得使用绑定挂载的所有优势——也就是说,数据库数据在容器文件系统之外维护,即使容器被删除也会持续存在——无需处理权限。
我是 运行 docker.io/library/mariadb:latest 映像,在 Centos 8 上使用 podman。我正在主机上安装一个卷用于数据库的持久存储。我知道必须更改主机上的目录所有权,容器内的用户才能获得 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 分配。 这个问题的原因是实现基础设施的自动化 provisioning/setup 而无需担心手动步骤。
处理这种情况的最简单方法是使用命名卷,而不是绑定安装。例如,如果我们 运行...
podman run -it --rm -v mariadb_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret mariadb:latest
...然后容器将正常启动。 -v
选项的这种形式导致 podman
创建一个 命名卷 ,而不是像我们使用绑定挂载那样使用特定的现有主机目录。
挂载命名卷时,卷的所有权设置为主容器进程所在的 UID 运行ning,因此默认情况下它具有正确的权限。
这几乎可以让您获得使用绑定挂载的所有优势——也就是说,数据库数据在容器文件系统之外维护,即使容器被删除也会持续存在——无需处理权限。