在docker容器中创建用户组和用户,并且多用户共用一个anaconda环境
转载自:https://www.cnblogs.com/devilmaycry812839668/p/13760815.html
在docker容器中创建用户组和用户,并且多用户共用一个anaconda环境
背景:
实验室可以使用一个浪潮的AI计算平台,该平台运行的都是docker容器,并且不能联网,因此谁要是想要安装什么软件的话就需要自己单独打包镜像到平台上,大致步骤为:
1. 在平台的镜像管理中找到自己想要用的基础镜像,将其从云主机的docker镜像库中导出到云主机硬盘中
2. 将云硬盘中的镜像通过sftp下载到本地电脑上(Ubuntu18.04, 已安装docker)
3. 将下载到本地硬盘上的镜像导入到本地主机的docker库中
4. 将导入到本地主机docker库中的镜像启动为容器,并安装你所需要的软件
5. 将安装好软件的容器保存为新的镜像
6. 将保存好的新的镜像从本地docker库中导出到本地硬盘
7. 把新的镜像从本地硬盘通过sftp上传到云主机硬盘
8. 将保存在云主机硬盘上的新的镜像导入到云主机docker库中
9. 将云主机中docker库中新导入的镜像启动为容器
经过上述步骤,成功完成浪潮AI计算平台的docker容器内运行软件的更新。
不过上述方法教给实验室的师弟后,可谓是叫苦连天,太过于复杂的麻烦的更新步骤,难以推广开。
于是乎,我想到了一个新的解决方法, 如果我们不把docker镜像打包,而是直接把所用的软件打包,直接上传可不可以呢。因为实验室里的大家都是使用python及其第三方框架,没有太多的系统依赖,docker镜像之所以好用就是因为它可以很好的打包系统依赖,但是我们不需要系统依赖的软件是不是docker镜像的这种打包方式也显得笨重了呢。这就和你在A同学的windows10电脑上安装了个QQ,你想在B同学电脑上也安装个QQ,虚拟机的解决方法是直接把A同学电脑的系统打包成镜像然后安装到B同学电脑上,docker的解决方法是直接把QQ软件相关的依赖和QQ软件自身打包做成镜像然后再安装到B同学电脑上,但是如果QQ这个软件本身就不依赖系统组件或环境呢,换句话说如果QQ所依赖的系统环境是最基本的,只要是windows10系统都会满足这种依赖的情况下我们如何做呢?我们只需要把安装好的QQ程序(从exe中解压出的程序库等)直接copy到B同学电脑上,然后直接在B同学电脑上运行不就解决了嘛,这样花费较小的代价也是可以解决问题的。其实更简单的,或是大家实际的做法就是把A同学电脑上QQ安装程序(那个EXE文件)直接拷贝到B同学电脑上,然后安装运行。
由于AI计算平台同样是这个情况,我们所需要的python第三方包不能联网通过pip或aconda安装,但是这些python库根本就不依赖系统环境,那么我们直接把所要用的第三方包,包括不同版本的python打包,然后上传到容器中就可以了,完全不用上面那种花9个步骤来回导入导出docker镜像的方法。
------------------------------------------------------------
给出具体的操作:
(所有计算平台上的docker容器都挂载一个云主机目录,我的账号下面给的挂载目录为 /testsoft01 )
(以下操作都是在root权限下的)
0. 首先在/testsoft01 目录下安装 anaconda
1. 在挂载的目录下创建home目录
mkdir /testsoft01/home
2. 将docker容器挂载的目录更改权限
文件所属者可以rwx, 同组的rw, other也是rw权限。
chmod -R 755 /testsoft01/
3. 创建用户组名
addgroup wisdom
4. 创建用户 devil , 并指定用户组 wisdom, 指定主目录 /home/devil , 给出shell执行路径 /bin/bash
useradd -d /home/devil -s /bin/bash -m devil -g wisdom
5. 由于/home路径为容器的路径,如果销毁容器则就是该目录,因此将/home下的目录转移到挂载目录下
mv /home/devil/ /testsoft01/home/
6. 将devil用户的home目录移到挂载目录中后,为其创建软链接,目标目录设回原用户目录
ln -s /testsoft01/home/devil/ /home/devil
7. 为新创建的用户devil设置密码
passwd devil
(#删除创建的用户(如果创建错了用这个删) userdel -r devil )
8. 为新建的用户devil 配置aconda环境
# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/testsoft01/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/testsoft01/anaconda3/etc/profile.d/conda.sh" ]; then. "/testsoft01/anaconda3/etc/profile.d/conda.sh"elseexport PATH="/testsoft01/anaconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<. /etc/aistationbc
cd /home/devil
结束配置, 配置成功。以上操作后,新创建的用户可以通过在 /testsoft01/anaconda3/envs 下面加入自己打包的环境,就可以正常运行了。(当然这个需要root权限,因为anaconda3文件加设置root可写,这样也防备用户胡乱更改或添加python环境)
-----------------------------------------------------------------
打包
可以看到 anaconda环境下面有个tf-14.0的环境, 我们先要把它打包,命令:
tar -cvf /tmp/x.tar ./tf-14.0/
或者:
tar -cvf /tmp/x2.tar anaconda3/envs/tf-14.0/
其中,
tar -cvf /tmp/x.tar ./tf-14.0/
命令打包后解压出来的直接就是 ./tf-14.0
tar -cvf /tmp/x2.tar anaconda3/envs/tf-14.0/
命令打包后解压出来的直接就是 anaconda3/envs/tf-14.0/
解压
tar -xvf x.tar
x.tar 解压出来直接是 tf-14.0
而:
tar -xvf x2.tar
x2.tar 解压出来是 anaconda3/envs/tf-14.0 :
----------------------------------------------
chmod -R 755 /testsoft01/addgroup wisdomuseradd -d /home/devil -s /bin/bash -m devil -g wisdom
mv /home/devil/ /testsoft01/home/
ln -s /testsoft01/home/devil/ /home/devil
passwd devil
#删除创建的用户(如果创建错了用这个删) userdel -r devil# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/testsoft01/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; theneval "$__conda_setup"
elseif [ -f "/testsoft01/anaconda3/etc/profile.d/conda.sh" ]; then. "/testsoft01/anaconda3/etc/profile.d/conda.sh"elseexport PATH="/testsoft01/anaconda3/bin:$PATH"fi
fi
unset __conda_setup
# <<< conda initialize <<<. /etc/aistationbc
cd /home/devil
在docker容器中创建用户组和用户,并且多用户共用一个anaconda环境相关推荐
- Docker之旅:在Docker容器中创建第一个程序
Docker的概念 Docker是开发人员和系统管理员 使用容器开发,部署和运行应用程序的平台.使用Linux容器来部署应用程序称为集装箱化.容器不是新的事物,但它们用于轻松部署应用程序. 一.测试一 ...
- docker容器内开启22 ssh_细述docker容器中创建SSH服务镜像
基于commit 命令 方式创建 docker的安装 [root@test01 ~]# yum install docker [root@test01 ~]# systemctl enable doc ...
- docker 容器中创建文件修改操作提示 Permission denied问题
问题: 通过上面可以知道显示的是权限禁止,意思就是权限不足 那么问题是有时候我们要有相应的权限进行一些文件创建修改等操作怎么办? 注意看上面的命令 docker exec -it 容器名称或ID ba ...
- 在docker容器中操作es,并给es7.6添加用户鉴权设置密码
1.docker启动命令:docker-compose up -d 加上 -d 表示后台运行,只是docker-compose up则是在控制台运行,会不停的打印日志. 2.从容器中拷贝文件到宿主机: ...
- Docker 入门系列(3)- Docker 容器(创建、启动、终止、进入、删除、导入、导出容器、容器和镜像转化)
Docker 容器 简单来说,容器是镜像的一个运行实例.所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层. 如果认为虚拟机是模拟运行的一整套操作系统(包括内核.应用运行态环境和其他系 ...
- 如何在Docker容器中挂载主机目录
本文翻译自:How to mount a host directory in a Docker container I am trying to mount a host directory into ...
- docker 容器中的 uid 和 gid
先来了解下 uid 和 gid uid 和 gid 由 Linux 内核负责管理,并通过内核级别的系统调用来决定是否应该为某个请求授予特权.比如当进程试图写入文件时,内核会检查创建进程的 uid 和 ...
- docker -v 覆盖了容器中的文件_10分钟让你理解 docker 容器中的 uid 和 gid
默认情况下,容器中的进程以 root 用户权限运行,并且这个 root 用户和宿主机中的 root 是同一个用户.听起来是不是很可怕,因为这就意味着一旦容器中的进程有了适当的机会,它就可以控制宿主机上 ...
- 如何在Docker容器中运行GUI程序
如何在Docker容器中运行GUI程序 各位,今天我们将学习如何在Docker之中运行GUI程序.我们可以轻易地在Docker容器中运行大多数GUI程序且不出错.Docker是一个开源项目,提供了一个 ...
最新文章
- c#属性的相关学习总结。
- 怎样判别蓄电池的好坏?
- JZOJ 5234. 【NOIP2017模拟8.7A组】外星人的路径
- 融合趋势下基于 Flink Kylin Hudi 湖仓一体的大数据生态体系
- AUTOMAKE\AUTOCONF
- μC/OS-Ⅱ的移植
- python中split啥意思_python中split的用法详解_后端开发
- SQL 创建数据库、表以及索引
- 8日直播预告丨Oracle 19c X86下移经验分享
- 嘉年华回顾丨李海翔带你解密腾讯TDSQL数据库的技术与未来
- Spring与Quartz集成详解
- Java Swing Mysql实现的员工工资管理系统项目源码附带视频指导运行教程
- del退役了/del 滚回来了
- 寻找最大的K个数(下)
- 计算机科学导论课后感,关于《计算机科学导论》课程教学的思考
- 网络安全工程师面试题汇总
- UNCTF2022-公开赛|MISC(下)
- android bitmap大小端,1. 解析Bitmap的ARGB,实现图片颜色选择器
- pdf编辑器Acrobat Pro DC 2019 for Mac——创建和编辑最智能的PDF!
- 关于sql server 安装程序在运行 Windows Installer 文件时遇到错误。
热门文章
- mysql五日均线_中国股市:一根“5日均线”走天下,线上买,线下卖,简直了!...
- limited扫描仪 pfu_扫描一气呵成:PFU新款扫描仪赏析
- flume采集数据易出现的bug
- 程序员副业之如何利用空余时间从博客中赚钱?
- 微内核是什么?宏内核是什么?一文带你了解操作系统内核架构!
- 鸿蒙 微内核 什么意思,鸿蒙系统所说的「微内核」,具体是什么?
- 厦大2021级期末上机考试
- CLEval: Character-Level Evaluation for Text Detection and Recognition Task 论文阅读
- Android Studio 光标莫名其妙加粗后,与 insert 键相反的问题
- 计算机把C盘无法扩展,如何解决可分配空间却无法扩展C盘的问题?