背景

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.000
Traceback (most recent call last):
  File "redisMigrate.py", line 15, in <module&gt;
    from log.log import get_logger
  File "/app/log/log.py", line 11, in <module>
    os.makedirs(full_path)
  File "/usr/local/lib/python3.7/os.py", line 221, in makedirs
    mkdir(name, mode)
PermissionError: [Errno 13] Permission denied: '/app/logs/20230201'

使用 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 最佳实战

原文地址:https://blog.csdn.net/MyySophia/article/details/128936545

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_34670.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注