1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 为什么bitnami 安装的软件进入容器 用户名都是I have no name

为什么bitnami 安装的软件进入容器 用户名都是I have no name

时间:2021-11-18 13:15:56

相关推荐

为什么bitnami 安装的软件进入容器 用户名都是I have no name

文章目录

背景原因user 参数的缺陷一### user 参数的缺陷二 Docker 官方的解决方案

背景

在bitnami 安装的软件进入容器用户名都显示I have no name,这是什么原因呢?

原因

在k8中容器默认好像是以uid=1001启动的,可以修改该uid

docker 启动的时候使用 --user 参数来指定容器内部的用户和组的 id,譬如:

$ docker run --rm \--user=$UID:$(id -g $USER) \-v "$PWD":/project \debian \bash -c "touch /project/tmp.txt"$ ls -l tmp.txt-rw-r--r-- 1 current_user current_user 0 Sep 28 02:09 tmp.txt

可以看到输出,current_user 处会显示主机当前用户的名字,这解决了主机用户对挂载的卷没有权限的问题。

如果不指定,例如

docker run --rm \-v "$PWD":/project \debian \bash -c "touch /project/tmp.txt"$ ls -l tmp.txt-rw-r--r-- 1 root root 0 Sep 28 01:55 tmp.txt

主机当前目录出现了容器内创建的 tmp.txt,但是其权限、用户和组均是 root,其他用户不可写。

user 参数的缺陷一

使用 user 参数有一些缺陷,如果你进入容器内部的 terminal,会显示如下内容:

$ docker run --rm \-it \--user=$UID:$(id -g $USER) \-v "$PWD":/project \debian \bash -c "touch /project/tmp.txt && bash"I have no name!@6cc07662a201:/$

bash 的用户名会显示I have no name!,这是因为我们通过 --user 参数指定了容器内部的用户 id,但该 id 不存在于容器内的 /etc/passwd 文件中。这个uid好像默认是1001

### user 参数的缺陷二

除了用户名显示问题还存在一个问题,在绑定挂载中如果没有挂载的目录容器没有权限写入内容。

例如我之前开发的reids迁移程序日志需要保留

#] docker run --name redis-img-startline.txt-2 --user $(id -u) -v /opt/redis-mig/redis_key_mig:/app 10.50.10.185/harbortest/redis-mig:1.1 python3 redisMigrate.py 10.50.10.45 19000 10.50.10.170 7100 startline.txt.000Traceback (most recent call last):File "redisMigrate.py", line 15, in <module>from log.log import get_loggerFile "/app/log/log.py", line 11, in <module>os.makedirs(full_path)File "/usr/local/lib/python3.7/os.py", line 221, in makedirsmkdir(name, mode)PermissionError: [Errno 13] Permission denied: '/app/logs/0201'

使用 Docker 挂载 models 目录,然而在 Docker 容器内部除了 models 文件夹都没有访问权限。

$ docker run --rm \--user=$UID:$(id -g $USER) \-v "$PWD/models":/project/models \debian \bash -c "touch /project/tmp.txt"touch: cannot touch '/project/tmp.txt': Permission denied

这可以通过增加挂载路径:

$ docker run --rm \--user=$UID:$(id -g $USER) \-v "$PWD":/project \-v "$PWD/models":/project/models \debian \bash -c "touch /project/tmp.txt"$

这样容器运行过程往 /project 写的临时文件都会出现在主机上。

Docker 官方的解决方案

docker 解决方案

dockerfile 最佳实战

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。