概括:我尝试在podman
Ubuntu 服务器上使用其他映像存储,但遇到权限问题。运行时确实会显示共享图像podman images
。当我尝试运行它时,我得到了Error: creating /etc/mtab symlink: permission denied
。当我使用sudo
, 作为 sudoer 时,它会尝试拉取远程映像而不是使用本地共享映像。其他用户也无法运行共享映像。
我的方法基于两个博客:
目标:作为一名“服务器管理员”(实际上是一位计算机科学老师,几乎没有使用容器进行教育目的的系统管理经验),我想创建一个单身的共享映像并允许多个用户运行该共享映像。这样,我们就不会得到许多相同的副本(想想数百个学生拉图像副本作为替代)相同的为每个用户提供镜像,但每个用户都可以轻松使用相同的容器化设置。
我的尝试:
我相信我已经走到了那里的大部分路。然而,最终,帐户serveradmin
和典型用户(例如user01
)都无法运行共享映像。
这是全新安装 Ubuntu Server 时发生的情况。
首先,登录时serveradmin
,典型的更新内容
serveradmin@testserver> sudo apt update
serveradmin@testserver> sudo apt dist-upgrade
接下来,安装podman
并测试它是否有效
serveradmin@testserver> sudo apt install podman
serveradmin@testserver> podman run hello-world # worked perfectly
期望只看到 hello-world 图像。是的,有效。
serveradmin@testserver> podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/hello-world latest feb5d9fea6a5 13 months ago 19.9 kB
创建共享存储位置供所有用户访问图像
serveradmin@testserver> sudo mkdir /var/lib/shared-storage
拉我的pmtest
(“podman 测试”)图像从 DockerHub 拉入共享地点
serveradmin@testserver> podman --root /var/lib/shared-storage pull docker.io/<my_dockerhub>/pmtest
寻找拉取的图像,它还不可见,正如预期的那样
serveradmin@testserver> podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/hello-world latest feb5d9fea6a5 13 months ago 19.9 kB
为以下内容创建存储配置serveradmin
serveradmin@testserver> mkdir ~/.config/containers/
serveradmin@testserver> vim .config/containers/storage.conf
serveradmin@testserver> cat ~/.config/containers/storage.conf
[storage]
driver = "overlay"
[storage.options]
additionalimagestores = [ "/var/lib/shared-storage"]
serveradmin
用户无法阅读/var/lib/shared-storage/*
以列出图像
serveradmin@testserver> podman images
Error: error opening "/var/lib/shared-storage/overlay-images/images.lock": permission denied
使用sudo
,看不到任何图像,甚至看不到之前可见的hello-world
图像
serveradmin@testserver> sudo podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
那么,让/var/lib/shared-storage
世界可读、世界可执行,这样可以吗?
serveradmin@testserver> sudo chmod +r -R /var/lib/shared-storage/
serveradmin@testserver> sudo chmod +x -R /var/lib/shared-storage/
现在图像确实对用户serveradmin
可见
serveradmin@testserver> podman images
REPOSITORY TAG IMAGE ID CREATED SIZE R/O
docker.io/<my_dockerhub>/pmtest latest 824fec7db82a 16 minutes ago 262 MB true
docker.io/library/hello-world latest feb5d9fea6a5 13 months ago 19.9 kB false
但是,无法运行图像,多次尝试
serveradmin@testserver> podman run pmtest
Error: creating /etc/mtab symlink: permission denied
serveradmin@testserver> podman run docker.io/<my_dockerhub>/pmtest:latest
Error: creating /etc/mtab symlink: permission denied
sudo
使用任一时都无法运行
serveradmin@testserver> sudo podman run pmtest
Error: short-name "pmtest" did not resolve to an alias and no unqualified-search registries are defined in "/etc/containers/registries.conf"
使用sudo podman run
拉取映像而不是运行共享映像。这不是我想要的。
serveradmin@testserver> sudo podman run docker.io/<my_dockerhub>/pmtest:latest
Trying to pull docker.io/<my_dockerhub>/pmtest:latest...
Getting image source signatures
Copying blob cf92e523b49e done
Copying blob d59e8b19e2b2 [====================>-----------------] 37.2MiB / 68.6MiB
那么另一个用户呢?无论如何,这就是最终目标,因此创建另一个标准用户
serveradmin@testserver> sudo useradd user01
serveradmin@testserver> sudo passwd user01
New password:
Retype new password:
passwd: password updated successfully
登录为user01
,看不到任何图像
user01@testserver> podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
为 ,创建附加图像存储配置user01
,就像以前一样
user01@testserver> micro .config/containers/storage.conf
user01@testserver> cat ~/.config/containers/storage.conf
[storage]
driver = "overlay"
[storage.options]
additionalimagestores = [ "/var/lib/shared-storage"]
现在,user01
确实可以看到共享图像了
user01@testserver> podman images
REPOSITORY TAG IMAGE ID CREATED SIZE R/O
docker.io/<my_dockerhub>/pmtest latest 824fec7db82a 5 hours ago 262 MB true
但是,user01
仍然无法运行图像,与 相同的问题serveradmin
,除了甚至无法使用sudo
user01@testserver> podman run pmtest
Error: creating /etc/mtab symlink: permission denied
user01@testserver> podman run docker.io/<my_dockerhub>/pmtest:latest
Error: creating /etc/mtab symlink: permission denied
user01@pmtestserver:~$
答案1
我认为您可能错过了几个关键步骤。我将在我自己的 Ubuntu 22.04.1 系统上逐步完成该过程,让我们看看最终结果如何。
我将在安装后立即开始podman
。首先,让我们看看我们得到了什么版本:
root@ubuntu:~# podman version
Version: 3.4.4
API Version: 3.4.4
Go Version: go1.17.3
Built: Thu Jan 1 00:00:00 1970
OS/Arch: linux/amd64
嗯,这令人失望。 Podman 4 于 2021 年 8 月发布。我们可能会遇到此版本中未实现的功能(尽管您链接的第一篇文章于 2020 年发布,所以我们应该没问题)或 bug已在较新的版本中修复,但我们还是尝试一下吧!
创建共享图像存储
这将看起来引人注目地与您尝试过的类似:)。
我们需要一个用于共享存储的目录:
mkdir /var/lib/shared-storage
让我们用图像填充它:
podman --root /var/lib/shared-storage pull docker.io/alpine:latest
我们知道那之所以有效,是因为我们在使用该选项时可以看到图像
--root
:root@ubuntu:~# podman --root /var/lib/shared-storage/ image ls REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/library/alpine latest 9c6f07244728 2 months ago 5.83 MB
现在我们需要配置以下
additionalimagestores
选项/etc/containers/storage.conf
:[storage] driver = "overlay" graphroot = "/var/lib/containers/storage" [storage.options] additionalimagestores = ["/var/lib/shared-storage"]
(该
graphroot
选项之所以存在,是因为如果没有它,它podman
会不断地大喊它未设置。)有了这个配置——并且没有其他变化-- 我们看到它可以
podman
运行为root
:root@ubuntu:~# podman image ls REPOSITORY TAG IMAGE ID CREATED SIZE R/O docker.io/library/alpine latest 9c6f07244728 2 months ago 5.83 MB true
R/O
请注意,我们在该输出中看到了附加列,表明正在podman
从我们的additionalimagestores
.仍然运行
root
,我们可以从该镜像启动一个容器:root@ubuntu:~# podman run --rm docker.io/alpine:latest cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.16.2 PRETTY_NAME="Alpine Linux v3.16" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
您可以看到它不需要拉取图像,因为它已经存在于共享位置。
以非特权用户身份访问共享映像存储
现在我们已经可以为 工作了root
,让我们让它为非特权用户工作。我创建了一个这样的测试用户:
useradd -m -c "Test User 001" user001
成为测试用户1:
su - user001
创建
$HOME/.config/containers/storage.conf
为:mkdir ~/.config/containers cat > ~/.config/containers/storage.conf <<EOF [storage] driver = "overlay" [storage.options] additionalimagestores = ["/var/lib/shared-storage"] [storage.options.overlay] mount_program = "/usr/bin/fuse-overlayfs" EOF
最后一点——设置
storage.options.overlay.mount_program
——至关重要(直接来自您链接的第一篇文章)。尝试访问新的图像存储...
podman image ls
...然后看着它失败:
Error: error opening "/var/lib/shared-storage/overlay-images/images.lock": permission denied
授予对所有内容的读取权限(以及对目录的执行权限)
/var/lib/shared-storage
.作为root
, 跑步:chmod -R a+rX /var/lib/shared-storage/
返回帐户
user001
并重新尝试我们的podman
命令:user001@ubuntu:~$ podman image ls REPOSITORY TAG IMAGE ID CREATED SIZE R/O docker.io/library/alpine latest 9c6f07244728 2 months ago 5.83 MB true
通过运行容器来验证一切正常:
user001@ubuntu:~$ podman run --rm docker.io/alpine:latest cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.16.2 PRETTY_NAME="Alpine Linux v3.16" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
就是这样!如果您在此过程中的任何时候看到不同的行为,请告诉我,我会看看我们能找出什么。
1请注意,为了使这一步发挥作用并停止podman
抱怨,我必须loginctl enable-linger 1000
和。这只是必要的,因为我们正在使用;如果我们通过本地控制台登录,则没有必要。systemctl start [email protected]
su
ssh