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

117 篇文章 10 订阅
45 篇文章 2 订阅

背景

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyySophia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值