首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拒绝在podman.sock中使用无根Podman +码头-组合+ Traefik的权限

拒绝在podman.sock中使用无根Podman +码头-组合+ Traefik的权限
EN

Stack Overflow用户
提问于 2022-09-22 12:26:46
回答 1查看 1.1K关注 0票数 1

TL:博士:尝试通过Podman套接字使用无根podman与码头组合,并使用Traefik容器(与podman套接字对话)代理与https://stackoverflow.com/a/73774327/1469083相关的其他容器的流量。

我获得了被拒绝的权限错误,我可以用特权容器修复这些错误,我不想使用这些错误。

设置

我在RHEL 8上跑

代码语言:javascript
复制
$ cat /etc/redhat-release 
Red Hat Enterprise Linux release 8.6 (Ootpa)

Podman预装好了,我添加了坞-撰写(“独立”)和podman:

代码语言:javascript
复制
$ curl -SL https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
$ chmod a+x /usr/local/bin/docker-compose
$ sudo yum install podman-docker

激活无根的podman套接字,以便podman和docker撰写人可以相互交谈:

代码语言:javascript
复制
$ systemctl --user enable podman.socket
$ systemctl --user start podman.socket
$ systemctl --user status podman.socket
$ export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock
$ echo $DOCKER_HOST
unix:///run/user/1001/podman/podman.sock

我还将网络后端切换到netavark,如果没有这种更改,DNS就无法工作。

代码语言:javascript
复制
$ podman info |grep -i networkbackend
  networkBackend: netavark

问题

首先,我尝试了使用https://stackoverflow.com/a/73774327/1469083编写堆栈,并做了一些小修改:

代码语言:javascript
复制
version: "3"
services:
  frontend:
    image: "docker.io/traefik:v2.8"
    ports:
      - "3000:80"
      - "127.0.0.1:3080:8080"
    command:
      - --api.insecure=true
      - --providers.docker
    volumes:
      - /run/user/$UID/podman/podman.sock:/var/run/docker.sock

  backend:
    labels:
      traefik.http.routers.backend.rule: Host(`localhost`)
    image: "tomcat:latest"
    scale: 3

我的安装程序没有欣赏$UID变量:

代码语言:javascript
复制
WARN[0000] The "UID" variable is not set. Defaulting to a blank string. 
...
Error response from daemon: make cli opts(): error making volume mountpoint for volume /run/user//podman/podman.sock: mkdir /run/user//podman: permission denied

我用硬编码的UID=1001替换了卷映射(它是运行无根播客的用户的UID,我以为我应该使用那个?)。套接字如下所示:

代码语言:javascript
复制
ls -la /run/user/1001/podman/podman.sock 
srw-rw----. 1 myrootlessuser myrootlessuser 0 22. 9. 11:28 /run/user/1001/podman/podman.sock


volumes:
  - /run/user/1001/podman/podman.sock:/var/run/docker.sock

但是,现在我从试图连接到/var/run/docker.sock的Traefik获得了被拒绝的权限,但没有成功:

代码语言:javascript
复制
example-docker-compose-frontend-1  | time="2022-09-22T12:04:52Z" level=error msg="Provider connection error Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get \"http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version\": dial unix /var/run/docker.sock: connect: permission denied, retrying in 5.656635591s" providerName=docker

如果我将Traefik容器更改为privileged: true,就会解决这个问题。我再也不明白错误了,代理就像它应该做的。

但是,出于安全原因,我不愿意使用特权容器,或者至少理解为什么会出现这种情况。

问题

  1. 如何使用非特权的Traefik容器?

  1. 如何验证无根对接/podman套接字是否正确工作?我见过这样的命令用于测试rootful podman套接字,但在无根环境下还没有成功

$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping

curl: (7) Couldn't connect to server

  1. 在哪里可以找到为无根
  2. 设置对接套接字的文档?我的设置正确吗(systemctl --user enable podman.socket等)?我只找到了一些关于这方面的博客,建议也各不相同,而且通常是针对较老的Podman版本。例如:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-22 15:45:48

问题1和2

如果你正在使用

代码语言:javascript
复制
export DOCKER_HOST=unix:///run/user/$UID/podman/podman.sock

您正在使用无根(非特权) Podman (即使您在撰写文件中指定了privileged: true )。

要在容器中使用泄漏的套接字,需要使用命令行选项--security-opt label=disable运行--security-opt label=disable

示例:

启动并启用podman套接字

代码语言:javascript
复制
$ systemctl --user enable --now podman.socket
Created symlink /home/testuser/.config/systemd/user/sockets.target.wants/podman.socket → /usr/lib/systemd/user/podman.socket.

测试Docker服务。结果:失败。卷曲印Couldn't connect to server

代码语言:javascript
复制
$ podman run --rm \
  -v $XDG_RUNTIME_DIR/podman/podman.sock:/var/run/docker.sock \
  docker.io/library/fedora \
    /usr/bin/curl \
      -H "Content-Type: application/json" \
      --unix-socket /var/run/docker.sock \
        http://localhost/_ping
curl: (7) Couldn't connect to server

再次测试Docker服务,但现在添加--security-opt label=disable。结果:成功

代码语言:javascript
复制
$ podman run --rm \
  --security-opt label=disable \
  -v $XDG_RUNTIME_DIR/podman/podman.sock:/var/run/docker.sock \
  docker.io/library/fedora \
    /usr/bin/curl \
      -Hs "Content-Type: application/json" \
      --unix-socket /var/run/docker.sock \
        http://localhost/_ping
OK$

Docker服务响应文本字符串OK。

(在上面的命令中,我还添加了curl选项-s,以便curl打印更少的调试输出)

我猜想,将--privileged添加到复合文件中与向podman run提供privileged: true命令行选项具有相同的效果。

使用--privileged的效果之一是它意味着-安全-选择label=disable

问题3

摘要:

这就够跑了

代码语言:javascript
复制
$ systemctl --user start podman.socket

为无根Podman设置UNIX套接字。

没有必要,但是如果你除了跑步

代码语言:javascript
复制
$ systemctl --user start podman.service

podman.service将立即启动(甚至在第一个客户端连接到UNIX之前)。

较长版本:

如果podman.socket是活动的,那么podman.service将在客户端连接时启动。(Podman支持套接字激活)

如果启用了podman.service (systemctl --user enable podman.service)并且启用了挥之不去(loginctl enable-linger),那么在重新启动之后也会启动podman.service。

如果启用了podman.service (systemctl --user enable podman.service),则当用户登录时也会启动podman.service。

在podman.service中运行的podman进程将在一段时间不活动后自动退出(默认为5秒)。

在Fedora 36计算机上,Restart指令被设置为no (默认值):

代码语言:javascript
复制
$ grep Restart= /usr/lib/systemd/user/podman.service
$ 

这意味着这并不重要

代码语言:javascript
复制
systemctl --user enable podman.service

是否已经运行过。如果没有客户端访问,服务podman.service将在5秒内停止。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73814619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档