我已经在 Windows 11(Pro,如果重要的话)机器上设置了 containerd,并且尝试在没有管理员权限的情况下运行一些 Windows 格式的容器。但是,当我尝试加载(从 tarball)或使用 nerdctl 运行映像时遇到以下错误:
time="2022-09-08T10:29:57-05:00" level=info msg="apply failure, attempting cleanup" error="failed to extract layer sha256:ec3e6a046fddc46b8fd9c814b01539e6798caec7d33f3c43c2eedd476af287e1: Could not enable privileges \"Back up files and directories\", \"Restore files and directories\": unknown" key="extract-27958500-ByGC sha256:ec3e6a046fddc46b8fd9c814b01539e6798caec7d33f3c43c2eedd476af287e1"
time="2022-09-08T10:29:57-05:00" level=fatal msg="failed to extract layer sha256:ec3e6a046fddc46b8fd9c814b01539e6798caec7d33f3c43c2eedd476af287e1: Could not enable privileges \"Back up files and directories\", \"Restore files and directories\": unknown"
我发现,以提升的权限运行 containerd 时,镜像可以完美加载和运行。但是,以管理员身份运行 containerd 并不适合我的目的。
我已确保 containerd 以用户可用的根和状态运行(已在另一个磁盘、C: 驱动器根目录下的文件夹中以及用户文件夹内尝试过)。如前所述,我还验证了当以管理员身份运行 containerd 时,该映像确实按预期工作,并且在 Windows 容器模式下在 Docker Desktop(其构建地)中工作。
我确实注意到,containerd 创建的状态文件夹和根文件夹被标记为只读,并且用户无权访问状态文件夹(containerd 控制台中的警告提醒了我这一点)。然而,虽然在修复根文件夹的权限并将两个文件夹设置为读写后,containerd 的警告得到了解决,但加载和运行图像的问题仍然存在。
我正在运行 Windows 11 版本 21H2(内部版本 22000.856)、containerd 版本 v1.6.8(9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6)和 nerdctl 0.22.2。
有人遇到过这个问题吗?任何指点都将不胜感激。谢谢!
答案1
从 tarball 应用根文件系统映像时,containerd 需要能够设置文件访问和所有权正确 - 这需要在 Windows 和 Linux 上具有高于正常的权限(只有 root 可以chown
执行某些操作)。
具体来说,“恢复文件和目录”(SeRestorePrivilege)大致相当于 Windows 中的 CAP_CHOWN 和 Linux 上的 CAP_DAC_OVERRIDE 功能 - 它允许进程设置任意文件所有者,以及定义引用不存在的 SID 的 ACL 条目。同样的 SeRestorePrivilege 还允许进程创建/写入/删除文件,而无需考虑访问权限。
虽然从技术上来说这并不要求你成为管理员确切地(上述权限可以通过 secpol.msc 单独授予任何用户),拥有这些权限本质上使该帐户几乎拥有与管理员相同的权限 - 具有 SeBackupPrivilege 的用户可以读取系统上的任何文件,无论文件权限如何(当然是为了备份),具有 SeRestorePrivilege 的用户可以修改任何文件。(也可能是任何注册表项或其他可安全对象。)
containerd 中似乎没有任何选项可以禁用此功能。
答案2
Docker 为 Docker Daemon 和 Docker CLI 提供独立的 Windows 二进制文件。
您只需下载它们、将它们放在您的 PATH 中、将 Docker Daemon 注册为服务、启动它并正常运行 Windows 容器即可。
以管理员身份运行时使用以下 PowerShell 命令:
# Optionally enable required Windows features if needed
Enable-WindowsOptionalFeature -Online -FeatureName containers –All
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All
curl.exe -o docker.zip -LO https://download.docker.com/win/static/stable/x86_64/docker-20.10.13.zip
Expand-Archive docker.zip -DestinationPath C:\
[Environment]::SetEnvironmentVariable("Path", "$($env:path);C:\docker", [System.EnvironmentVariableTarget]::Machine)
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
dockerd --register-service
Start-Service docker
docker run hello-world
Docker 回答“来自 Docker 的问候!”。
我在文章中找到了这种方法 无需 Docker Desktop 即可运行 Windows 和 Linux 容器,但文章没有提到这种安装类型是否需要管理员权限来运行容器。