【发布时间】:2019-12-26 16:51:14
【问题描述】:
我正在尝试让 docker 容器从主机文件系统访问 letencrypt 证书。
我不想以 root 身份运行 docker 容器,而是以具有非常特定访问权限的用户身份运行。 我也不想更改证书的权限。 我想要的只是让给定的用户有权读取 docker 容器内的证书。
证书具有以下设置:
-rw-r----- 1 root cert-group
要运行 docker 容器的用户在 cert-group 中:
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 特别是这个要点引起了我的注意:
容器操作系统对所有在 容器运行时根据自己的配置。例如, 如果主机和容器中都存在用户A,则将用户A添加到组 主机上的 B 将不允许用户 A 写入由 容器内的组 B 除非在容器内创建组 B 容器以及用户 A 被添加到其中。
这让我想到,也许需要一个自定义的 Dockerfile,将用户添加到 docker 中,并使用户成为 999 的一部分(如前所述称为 ping):
FROM alpine:latest
RUN adduser -S --uid 113 -G ping myuser
USER myuser
运行它会得到完全相同的结果,但现在将 myuser 附加到 passwd:
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
这使它在容器内看起来正确,但不会改变最终结果 - 仍然拒绝权限。
任何正确方向的帮助或指示将不胜感激,因为我的想法已经不多了。
【问题讨论】:
标签: docker permissions docker-compose