如果没有 sudo 权限,我无法在容器中(通过 ssh)写入已安装的卷。挂载的文件夹是主机用户在主机上的主文件夹。我正在运行一个无根的 docker 守护进程。
我执行了以下步骤来启动容器:
我已经按照https://docs.docker.com/engine/security/rootless/上的说明设置了一个无根 docker
使用以下命令构建 Dockerfile(如下):
docker build --build-arg USER_ID=$(id -u) --build-arg GROUP_ID=$(id -g) --build-arg USER_NAME=user--build-arg USER_PASS=user -t test 。
使用以下命令启动容器:
docker run -d --name test_container -p 50000:22 -v /home/$(id -u -n):/mnt/home 测试
通过 SSH 连接到我的容器
ssh 用户@localhost -p 50000
当我在主目录中创建文件时,权限被拒绝。当我在主机中创建一个新文件夹并将其 chmod 为 777 时;然后我可以创建文件,但它们不会以正确的用户/组出现在我的原始主机中,而是得到类似以下内容的信息:
drwxrwxrwx 6 gdekkers gdekkers 4096 May 25 21:10 .
drwxr-xr-x 14 gdekkers gdekkers 4096 May 25 21:10 ..
drwxrwxrwx 3 gdekkers gdekkers 4096 Apr 30 13:01 SomeFolder
drwxr-xr-x 2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 docker 容器中挂载 NFS 共享,但我无法这样做,因为在 rootlesskit 下运行的容器没有在主机上使用升级权限的权限。
有没有办法使用 rootlesskit 挂载共享或以某种方式修改 rootlesskit?
Github 建议以非 root 用户身份运行运行程序,这会引起一些有关混合 docker 和非 docker 操作的问题。这非常烦人,因为它导致签出操作无法运行,因为它无法访问在 docker 容器中运行的操作创建的文件。
可以通过使用 rootless docker 运行 actions runner 来解决这个问题吗?
我想为 Docker 容器中的非 root 用户提供对主机上安装的卷的写入访问权限。我在容器和主机内也有相同的非 root 用户和组。
\n运行容器时,我将主机卷安装到其中-v /some/folder:/some/folder。我这样做是因为我的应用程序在 docker 容器内运行需要将文件写入已安装的主机文件夹。但由于我以非 root 用户身份运行我的应用程序,因此它 \xe2\x80\x99t 无权写入该文件夹。
另外,我已在容器内自动更改此安装的文件夹权限。\n我已将以下用户和组指定为主机上此文件夹的所有者:\n\xe2\x80\x9cnonrootuser1:nonrootgroup1\xe2\x80\x9d
\n对于“rootful”docker,它工作正常,但如果它在容器内是无根的,它会在用户和组下面显示为该文件夹的所有者:\n\xe2\x80\x9croot:nobody\xe2\x80\ x9d
\n重现此内容的步骤:
\ngroupadd -g 1015 nonrootgroup1\nuseradd -u 1099 nonrootuser1\nRun Code Online (Sandbox Code Playgroud)\nsudo su\n\nmkdir -p /var/osquery/sock\necho "hello world" > /var/osquery/sock/file.txt\n\nchown root:nonrootgroup1 /var/osquery/sock\nchmod g+s /var/osquery/sock/\nRun Code Online (Sandbox Code Playgroud)\nFROM alpine:3.14\n\nRUN addgroup -g 1015 -S nonrootgroup1\nRUN adduser -D nonrootuser1 -u 1099\n\nUSER nonrootuser1:nonrootgroup1\n\nCMD ["tail", "-f", "/dev/null"]\n …Run Code Online (Sandbox Code Playgroud) 虽然我只需按照主站点上的说明就可以在 Ubuntu 19.10 上运行无根 docker 容器,但它只持续了一天。
\n\nhttps://docs.docker.com/engine/security/rootless/
\n\n重启机器后,docker守护进程再也无法工作
\n\nsystemctl --user status docker\n\xe2\x97\x8f docker.service - Docker Application Container Engine (Rootless)\n Loaded: loaded (/home/ice/.config/systemd/user/docker.service; disabled; vendor preset: enabled)\n Active: failed (Result: exit-code) since Mon 2020-03-02 11:29:40 GMT; 2h 28min ago\n Docs: https://docs.docker.com\n Process: 1389 ExecStart=/home/ice/bin/dockerd-rootless.sh --experimental --storage-driver=overlay2 (code=exited, status=1/FAILURE)\n Main PID: 1389 (code=exited, status=1/FAILURE)\n\nMar 02 11:29:40 fractal systemd[8403]: docker.service: Service RestartSec=10s expired, scheduling restart.\nMar 02 11:29:40 fractal systemd[8403]: docker.service: Scheduled restart job, restart counter is at 3.\nMar 02 11:29:40 …Run Code Online (Sandbox Code Playgroud) TL:DR:尝试通过 podman 套接字将无根 Podman 与 docker-compose 结合使用,并使用 Traefik 容器(与 podman 套接字通信)将流量代理到其他容器,与/sf/answers/5164202921/相关
我收到权限被拒绝的错误,我可以使用我不想使用的特权容器来修复该错误。
我在 RHEL 8 上运行
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.6 (Ootpa)
Run Code Online (Sandbox Code Playgroud)
Podman 是预安装的,我添加了 docker-compose(“独立”)和 podman-docker:
$ 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
Run Code Online (Sandbox Code Playgroud)
并激活 rootless podman 套接字,以便 podman 和 docker-compose 可以相互通信:
$ 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
Run Code Online (Sandbox Code Playgroud)
我还将网络后端切换为 netavark,如果不进行更改,DNS 就无法工作 …
Docker 官方文档网站上有关无根数据目录的唯一信息是:
数据目录默认设置为 ~/.local/share/docker。数据目录不应位于 NFS 上。
但是,我在安装过程中没有找到任何选项可以通过dockerd-rootless-setuptool.sh install更改此设置
更改非 root 用户(无根模式)上 Docker 的默认数据目录。
这是我第一次在 stackoverflow 上问问题。我已经潜伏多年,但现在我终于决定自己注册。因此,如果我的问题/信息格式不正确,我深表歉意。
我慢慢地越来越熟悉 Podman,并且正在将一些容器从 docker(有根)转移到 podman(无根)。我在Debian 11上使用Podman 4.3.1。我已经设法让一些容器正常工作并且能够从外部连接到它们。但是,容器显示客户端/源 IP“127.0.0.1”,而不是我真实客户端的 IPv4。我想知道下面这样的事情是否可能?
为容器分配特定的 IPv4(无根)。使用 nftables/iptables 将数据包从主机网络转发到容器 ipv4(例如 192.168.1.12)。能够在容器中看到真实客户端的 IPv4,仍然能够使用fail2ban 等。
正如您可能注意到的,我仍然处于学习容器化如何工作的过程中,特别是对于网络而言。出于安全原因,我不想将主机网络用于我的容器。如果有不清楚的地方请告诉我,我会尽力更好地解释自己。
感谢您花时间阅读本文:)
我正在服务器上运行 docker rootless,遵循https://docs.docker.com/engine/security/rootless/。
这样我就可以拉取并运行 hello-world 了。但每当我想要提取更复杂的图像时,我都会遇到以下错误:
$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
83ee3a23efb7: Extracting [==================================================>] 28.57MB/28.57MB
db98fc6f11f0: Download complete
f611acd52c6c: Download complete
failed to register layer: ApplyLayer exit status 1 stdout: stderr: lchown /etc/gshadow: operation not permitted
Run Code Online (Sandbox Code Playgroud)
输出来自docker info:
$ docker info
Client:
Context: default
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 20.10.2
Storage Driver: vfs
Logging Driver: json-file
Cgroup Driver: …Run Code Online (Sandbox Code Playgroud) 在有根容器中,此问题的解决方案是运行--user "$(id -u):$(id -g)",但这不适用于无根包含系统(无根 docker,或在我的情况下为 podman):
$ mkdir x
$ podman run --user "$(id -u):$(id -g)" -v "$PWD/x:/x:rw" ubuntu:focal bash -c 'echo hi >> /x/test'
bash: /x/test: Permission denied
Run Code Online (Sandbox Code Playgroud)
因此,对于无根容器系统,我应该删除--user,因为根用户会自动映射到调用用户:
$ podman run -v "$PWD/x:/x:rw" ubuntu:focal bash -c 'echo hi >> /x/test'
$ ls -al x
total 12
drwxr-xr-x 2 asottile asottile 4096 Sep 3 10:02 .
drwxrwxrwt 18 root root 4096 Sep 3 10:01 ..
-rw-r--r-- 1 asottile asottile 3 Sep 3 10:02 test …Run Code Online (Sandbox Code Playgroud)