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

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 在bitnami 安装的软件进入容器用户名都显示I have no name,这是什么原因呢?

背景

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

8f4e0e68db33445696d0bc9f6d303082.png

1feb1a8305d24953a01c0df75319c864.png

cefe525822c84ccebf53a58f75a87a8d.png

原因

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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
26天前
|
存储 安全 Linux
Podman入门全指南:安装、配置与运行容器
Podman入门全指南:安装、配置与运行容器
310 1
|
2月前
|
运维 Kubernetes 监控
本地CentOS安装轻量级容器PaaS平台KubeSphere并实现无公网IP远程访问
本地CentOS安装轻量级容器PaaS平台KubeSphere并实现无公网IP远程访问
30 0
|
2月前
|
网络协议 安全 Linux
1.安装 docker 容器并配置镜像加速器
1.安装 docker 容器并配置镜像加速器
246 11
|
2月前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
162 0
|
2月前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
583 1
|
2月前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
112 0
|
2月前
|
Kubernetes 测试技术 Linux
【Docker管理工具】安装Docker容器自动更新工具Watchtower
【2月更文挑战第8天】安装Docker容器自动更新工具Watchtower
215 1
|
2月前
|
存储 监控 测试技术
【Docker管理工具】安装Oxker容器管理工具
【2月更文挑战第4天】安装Oxker容器管理工具
95 2
|
2月前
|
应用服务中间件 Docker 容器
Docker容器中安装Tomcat
【1月更文挑战第9天】Docker容器中安装Tomcat
64 8
|
2月前
|
存储 Linux 网络安全
Linux(CentOs7) --- 安装Docker容器
Linux(CentOs7) --- 安装Docker容器
246 1

热门文章

最新文章