我有一个帐户
grafana:x:494:494:Grafana User:/tmp:/sbin/nologin
我想用它来运行容器。如果我做
jsmith$ sudo -u grafana -s TMPDIR=/bs XDG_DATA_HOME=/bs XDG_CONFIG_DIR=/bs podman run --network-config-dir=/bs -it alpine
我得到:“无法 chdir 到 /home/jsmith:权限被拒绝”。如果我首先 chdir 到 grafana 可写的目录,我可以运行命令 OK。但是,我想从启动脚本启动它而不更改目录,即使用单个命令。我不知道怎么办。设置 HOME 没有帮助。我只能通过使用来解决这个问题
jsmith$ sudo su -l -s /bin/bash -c 'XDG_DATA_HOME=/bs XDG_CONFIG_DIR=/bs podman run --network-config-dir=/bs -it alpine' grafana
但这似乎是迂回的。
答案1
在我看来,这可以通过两种方式实现:
第一种方法是更改帐户,以便能够登录:
grafana:x:494:494:Grafana User:/tmp:/bin/bash
这可能是一个潜在的安全风险,因此如果您不希望这样做,您可以考虑使用 systemd 单元文件来启动它,而不是启动脚本。
将其保存到 /etc/systemd/system/[mycontainer].service:(将 mycontainer 替换为适合您的名称。)
[Unit]
Description=Run Container
AssertPathExists=/bs
[Service]
User=grafana
Group=grafana
Environment="XDG_DATA_HOME=/bs"
Environment="XDG_CONFIG_DIR=/bs"
Environment="TMPDIR=/bs"
ExecStart=podman run --network-config-dir=/bs -it alpine
Nice=5
# Uncomment this if you want the container to be started on boot, otherwise don't
#[Install]
#WantedBy=multi-user.target
然后运行systemctl enable mycontainer
就可以使用systemctl start mycontainer
和systemctl stop mycontainer
管理它了。
有关 Systemd 单位的更多信息,我发现这非常有帮助。
答案2
运行无根 Podman 时,Podman 默认将其容器和容器镜像存储在主目录中。
目录/tmp任何用户都可以写,所以最好让用户格拉法纳有自己的主目录。
$ sudo useradd grafana -s /sbin/nologin -c "Grafana User"
$ grep grafana /etc/passwd
grafana:x:1025:1025:Grafana User:/home/grafana:/sbin/nologin
$ sudo systemd-run --machine=test1@ \
--quiet \
--user \
--collect \
--pipe \
--wait \
podman \
run \
--rm \
docker.io/library/alpine echo hello
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob 8921db27df28 done
Copying config 042a816809 done
Writing manifest to image destination
Storing signatures
hello
$
我看到文字了“你好”在命令的输出中echo hello
。
测试效果很好。
另一个测试
如果你想/tmp作为主目录,但让 Podman 仅使用例如/var/bs,您可能可以通过传递与中相同的环境变量来使其工作回答作者:@Anuril。
我添加了选项
-E XDG_DATA_HOME=/var/bs \
-E XDG_CONFIG_DIR=/var/bs \
-E TMPDIR=/var/bs \
到上面的 systemd-run 命令,但该命令失败了
ERRO[0000] stat /tmp/.config/containers/storage.conf: permission denied
然后我也尝试添加
-E HOME=/var/bs \
但该命令失败并显示错误消息:
Error relocating /bin/echo: RELRO protection failed: Permission denied
详情请参阅:
$ useradd test2 -s /sbin/nologin -c "Grafana User" -d /tmp
$ grep test2 /etc/passwd
test2:x:1026:1026:Grafana User:/tmp:/sbin/nologin
$ sudo mkdir /var/bs
$ sudo chown test2:test2 /var/bs
$ sudo systemd-run \
-E XDG_DATA_HOME=/var/bs \
-E XDG_CONFIG_DIR=/var/bs \
-E TMPDIR=/var/bs \
-E HOME=/var/bs \
--machine=test2@ \
--quiet \
--user \
--collect \
--pipe \
--wait \
podman \
run \
--rm \
docker.io/library/alpine echo hello
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob 8921db27df28 done
Copying config 042a816809 done
Writing manifest to image destination
Storing signatures
Error relocating /lib/ld-musl-x86_64.so.1: RELRO protection failed: Permission denied
Error relocating /bin/echo: RELRO protection failed: Permission denied
$
我不知道为什么它失败了。