podman - 在不运行容器的情况下如何确定 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,因此默认具有正确的权限。
这为您提供了使用绑定挂载的几乎所有优点——也就是说,数据库数据在容器文件系统之外维护,并且即使容器被删除也会持续存在——而无需使用权限。
推荐阅读
- javafx - Javafx 组合框
- typescript - 如何让 TypeScript 知道我已经通过了 `modelValue`?
- python - 使用 Stomp 订阅 ActiveMQ Artemis 时遇到问题。队列已存在
- docker - 在 dockerfile 中安装 haskell 的 cabal 或 ghcup 不起作用
- python - if/else 语句仅在找到匹配项时运行
- amazon-web-services - S3 存储桶策略 IAM 角色显示为 API 密钥
- typescript - 想要连续运行 Google Cloud SQL 迁移
- html - 如何使用 puppeteer 点击标签
- arrays - 如何在反应中将对象值数组更改为对象值数组对象
- angular - 如何让图像在 Angular 的 jspdf 自动表中工作