我在将文件安装到 时遇到问题podman
。我的文件权限是0600
,但容器无法使用。如果我使用该--privileged
选项或卷传播选项,z
它就可以工作。但我的问题是我应该使用这些选项中的哪一个?或者也许还有另一种方法可以做到这一点......
让我向您描述这个案例以避免 XY 问题。我想certbot
使用 DNS Cloudflare 生成证书。我用的是Centos 8,所以必须通过docker/podman来完成。 Cerbot 需要 Cloudflare 的密钥,因此在~/.secrets/clodflare
路径中我创建cloudflare.ini
文件并希望将其安装到容器中。
答案1
让我尝试分享一些我自己这些天学到的经验。我不是专家。我无法建议您应该做什么,但可以尝试解释当您使用--privileged
和运行 podman 时会发生什么:z
。也许你已经知道这些了。
我假设您正在podman
无根运行,即 ,podman -v
而不是sudo podman -v
。我还假设~/.secrets/clodflare
归您所有,UID 为1000
。
您的情况(至少)有两个权限问题,即传统的 Unix 权限(0600
或-rw-------
)和 SELinux(container_file_t
、user_home_t:
、fusefs_t
等)。
UNIX权限
- 在容器中,文件/文件夹属于
root
.所以: 如果容器中的进程是由 运行的
root
,那么在主机上,它是由您运行的。所以它具有rw-
该文件夹/文件的权限。我想这就是你的情况。与--privileged
nor无关:z
。如果容器中的进程由另一个用户(例如 UID )运行
1234
,则在主机上,它由具有 UID 的用户运行101233
(默认情况下,基于 中的设置/etc/subid
)。因此,它仅具有---
该文件的权限。如果您想将所有权更改为1234
容器中的(或101233
主机上的),您可以运行,例如podman unshare chown -R 1234:1234 <path>
或sudo chown -R 101234:101234 <path>
。但是,我认为这不适用于您。如果在主机上,该文件不属于你,那么在容器中,根据 中的设置,它将属于别人
/etc/subid
。您可以通过谷歌搜索找到有关此主题的更多信息
podman namespace
。
- 在容器中,文件/文件夹属于
SELinux
- 在启用 SELinux 的主机上,仍然存在 SELinux 分离问题。
- 通过使用
--privileged
,您可以禁用 SELinux 分离(以及更多功能)。但它不会重新标记文件/文件夹。每次运行 podman 时,都应该像 一样运行podman -v <host-path>:<container-path> --previleged <image>
。 - 通过添加
:z
,您可以允许 podman 重新标记文件/文件夹。你只需要这样做一次。您可以通过ls -Z
或列出文件/文件夹来检查之前和之后的差异ls -Zd
。一旦文件或文件夹被正确地重新标记,下次您可以只运行podman -v <host-path>:<container-path> <image>
, without:z
,nor--privileged
。 - 关于这个问题的更多细节,我不能说太多,因为它对我来说太复杂了,无法理解。的手册页
podman run
、关于--privileged
、-v
的解释-security-opt
很有帮助。