我想让一个 docker 容器从主机文件系统中访问 letsencrypt 证书。
我不想以 root 用户身份运行 Docker 容器,而是要求使用具有特定访问权限的用户身份运行。
我也不想更改证书的权限。 我只需要让给定的用户能够在 docker 容器内读取证书。
该证书具有以下设置:
运行docker容器的用户属于证书组:
只要我们在主机上,这个工作就能完成 - 我可以使用用户“myuser”正常读取文件。
现在我想在装有证书的卷中在docker容器内进行此操作。 我已经做了多个测试用例,但都没有成功。
一个简单的docker-compose测试文件:
在这里,我假设"ping"是docker alpine内部的一个组,但是我得到了一些关于它如何与主机协作的混合信息。
根据这篇文章 https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf,我的理解是,有一个单一的内核处理所有权限(即主机),因此如果使用相同的uid和gid,则权限将继承自主机。然而,即使正在运行的用户是113:117,在主机上也属于组999,它仍然无法让我访问文件。
接下来,我发现了这篇文章https://medium.com/@nielssj/docker-volumes-and-file-system-permissions-772c1aee23ca,特别是这个项目引起了我的注意:
容器OS根据其自己的配置强制执行容器运行时中进行的所有操作的文件权限。例如,如果用户A在主机和容器中都存在,则将用户A添加到主机上的组B将不允许用户A写入容器内由组B拥有的目录,除非在容器内也创建组B并将用户A添加到其中。
这让我想到,可能需要一个自定义Dockerfile,将用户添加到docker中,并使用户成为999的一部分(正如之前所述,这被称为ping)。
这使其在容器内视觉上正确,但并不改变最终结果——仍然是权限被拒绝。非常感谢任何帮助或指引,因为我已经没有更多想法了。
-rw-r----- 1 root cert-group
运行docker容器的用户属于证书组:
uid=113(myuser) gid=117(myuser) groups=117(myuser),999(cert-group),998(docker)
只要我们在主机上,这个工作就能完成 - 我可以使用用户“myuser”正常读取文件。
现在我想在装有证书的卷中在docker容器内进行此操作。 我已经做了多个测试用例,但都没有成功。
一个简单的docker-compose测试文件:
version: '3.7'
services:
test:
image: alpine:latest
volumes:
- /etc/ssl/letsencrypt/cert.pem:/cert.pem:ro
command: >
sh -c 'ls -l / && cat /etc/passwd && cat /etc/group && cat /cert.pem'
user: "113:117"
restart: "no"
这段代码输出了很多内容,但最重要的是:
test_1 | -rw-r----- 1 root ping 3998 Jul 15 09:51 cert.pem
test_1 | cat: can't open '/cert.pem': Permission denied
test_1 | ping:x:999:
在这里,我假设"ping"是docker alpine内部的一个组,但是我得到了一些关于它如何与主机协作的混合信息。
根据这篇文章 https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf,我的理解是,有一个单一的内核处理所有权限(即主机),因此如果使用相同的uid和gid,则权限将继承自主机。然而,即使正在运行的用户是113:117,在主机上也属于组999,它仍然无法让我访问文件。
接下来,我发现了这篇文章https://medium.com/@nielssj/docker-volumes-and-file-system-permissions-772c1aee23ca,特别是这个项目引起了我的注意:
容器OS根据其自己的配置强制执行容器运行时中进行的所有操作的文件权限。例如,如果用户A在主机和容器中都存在,则将用户A添加到主机上的组B将不允许用户A写入容器内由组B拥有的目录,除非在容器内也创建组B并将用户A添加到其中。
这让我想到,可能需要一个自定义Dockerfile,将用户添加到docker中,并使用户成为999的一部分(正如之前所述,这被称为ping)。
FROM alpine:latest
RUN adduser -S --uid 113 -G ping myuser
USER myuser
运行这个命令会给我完全相同的结果,现在在passwd后面添加了myuser:
test_1 | myuser:x:113:999:Linux User,,,:/home/myuser:/sbin/nologin
以下是我尝试过的一些事情。
另一个是将 /etc/passwd 和 /etc/group 与在其他博客中找到的卷同步。
volumes:
- /etc/passwd:/etc/passwd
- /etc/group:/etc/group
这使其在容器内视觉上正确,但并不改变最终结果——仍然是权限被拒绝。非常感谢任何帮助或指引,因为我已经没有更多想法了。
:Z
是什么意思?你能解释一下吗? - Matt