【发布时间】:2020-10-12 04:36:12
【问题描述】:
初步
首先,初步。当运行一个卷映射到宿主机的某个部分的docker容器时,docker容器内的用户通常是root,所以对于容器生成的文件,宿主机不能编辑、修改或删除它们。为了解决这个问题,一些人(包括创建我正在使用的图像的人)建议使用-u
情况
我有一个 Docker 映像(由不同的人在不同的机器上构建)
此 Docker 映像假定用户将成为 id 为 1000 的用户
问题
当主机的唯一用户(用户ID为1000)的人运行图像时,没有问题。但是,就我而言,我是此主机的第二个用户,所以我的用户 ID 是 1001。所以我有以下内容:
在主机中,我使用cat /etc/passwd 并获得了多个用户,包括:
firstuser:x:1000:1000:firstluser,,,:/home/firstuser:/bin/bash
myself:x:1001:1001:My Name,,,:/home/myself:/bin/bash
然后:
CASE 1 我用
运行容器docker run -it --rm -u 1001:1001 -v /a/path:/another/path image /bin/bash
因为id -u 和id -g 给了我1001。(毕竟我是第二个用户)
这样做会导致
groups:cannot find name for group ID 1001
然后我的用户变成"I have no name!",当我这样做时cat/etc/passwd我得到
originaluser:x:1000:1000::/home/originaluser:bin/bash
显然我的用户 (1001) 不存在,这会导致很多问题。
为了解决这个问题我试过了
CASE2我用
运行容器docker run -it --rm -u 1000:1000 -v /a/path:/another/path image /bin/bash
这不会导致之前的错误,现在即使我是myself,但在容器中以firstuser 运行Docker 映像,我是originaluser(因为两者都是1000)
做cat /etc/passwd我可以看到
originaluser:x:1000:1000::/home/sensetime:bin/bash
正如预测的那样,我的用户是originaluser。
我应该很高兴,但是,这也会导致问题!
稍后容器内的程序尝试创建一个文件(用户为 1000),但由于它已映射且用户所有者为 1001,因此创建失败。
有什么好的方法可以防止所有这些问题,并且能够使主机中的用户与容器中的用户同步?
【问题讨论】:
-
您的主机用户需要直接编辑由容器进程管理的数据文件的用例是什么?在容器中运行交互式 shell 的异常情况下,“我没有名字”消息应该主要是一个外观问题。