背景:

实验室可以使用一个浪潮的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 ]; then
eval "$__conda_setup"
else
if [ -f "/testsoft01/anaconda3/etc/profile.d/conda.sh" ]; then
. "/testsoft01/anaconda3/etc/profile.d/conda.sh"
else
export 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 wisdom

useradd -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 ]; then
eval "$__conda_setup"
else
if [ -f "/testsoft01/anaconda3/etc/profile.d/conda.sh" ]; then
. "/testsoft01/anaconda3/etc/profile.d/conda.sh"
else
export PATH="/testsoft01/anaconda3/bin:$PATH"
fi
fi
unset __conda_setup
# <<< conda initialize <<< . /etc/aistationbc
cd /home/devil

在docker容器中创建用户组和用户,并且多用户共用一个anaconda环境的更多相关文章

  1. Docker----与Asp.net core 的完美结合,在docker容器中创建Asp.Net Core 项目

    在腾讯云上买了一个小容量的服务器,搭建一个docker环境后,可以尝试做一些单系统做起来很麻烦的东西.譬如说,你在windows OS或UbuntuOS中,突然想玩CentOS了,你可以选择将电脑再装 ...

  2. Docker容器中用户权限管理

    在Linux系统中有一部分知识非常重要,就是关于权限的管理控制:Linux系统的权限管理是由uid和gid负责,Linux系统会检查创建进程的uid和gid,以确定它是否有足够的权限修改文件,而非是通 ...

  3. 隔离 docker 容器中的用户

    笔者在前文<理解 docker 容器中的 uid 和 gid>介绍了 docker 容器中的用户与宿主机上用户的关系,得出的结论是:docker 默认没有隔离宿主机用户和容器中的用户.如果 ...

  4. 在 docker 容器中捕获信号

    我们可能都使用过 docker stop 命令来停止正在运行的容器,有时可能会使用 docker kill 命令强行关闭容器或者把某个信号传递给容器中的进程.这些操作的本质都是通过从主机向容器发送信号 ...

  5. 理解 docker 容器中的 uid 和 gid

    默认情况下,容器中的进程以 root 用户权限运行,并且这个 root 用户和宿主机中的 root 是同一个用户.听起来是不是很可怕,因为这就意味着一旦容器中的进程有了适当的机会,它就可以控制宿主机上 ...

  6. docker容器中Postgresql 数据库备份

    查看运行的容器: docker ps 进入目标容器: docker exec -u root -it 容器名 /bin/bash docker 中,以root用户,创建备份目录,直接执行如下命令, p ...

  7. docker容器中oracle数据库导出dmp文件

    Oracle数据库安装在docker容器中 1首先查看容器 docker ps 2进入oracle容器 docker exec -it 7f0f3f2d4f88 /bin/bash 3导出整个库:这个 ...

  8. 在docker容器中编译hadoop 3.1.0

    在docker容器中编译hadoop 3.1.0 优点:docker安装好之后可以一键部署编译环境,不用担心各种库不兼容等问题,编译失败率低. Hadoop 3.1.0 的源代码目录下有一个 `sta ...

  9. docker_facenet_image在Docker容器中运行Facenet环境搭建

    对开发和运维人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境.任意时间让应用正常运行.而Docker恰恰是可以实现这一终极目标的瑞士军刀. 具体来说,Docker在开发和运维过程中,具 ...

  10. [docker] 管理docker容器中的数据

    之前我们介绍了Docker的基本概念(前面的没翻译...),了解了如何使用Docker镜像进行工作,并且学习了网 络和容器之间的链接.这一节我们将讨论如何管理容器中及容器之间的数据. 我们将查看下面两 ...

随机推荐

  1. Vue学习:3.V标签综合3

    接上一篇... V标签综合使用:记事本案例 功能: 在实现列表渲染和删除功能的基础上,增加了数据添加以及数据统计,同时要求底部统计和清空区域在事件数目为0时不显示. 思路: 整体架构分为三部分:头部使 ...

  2. linux安装redis完整步骤

    linux安装redis完整步骤 安装:1.获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压 tar x ...

  3. 调用了这么久的JS方法是长在对象、类、值本身还是原型链上?

    调用了这么久的JS方法是长在对象.类.值本身还是原型链上? JavaScript这门语言总是能带给我惊喜,在敲代码的时候习以为常的写法,退一步再看看发现自己其实对很多基操只有表面的使用,而从来没思考过 ...

  4. 【资料分享】基于TI Sitara系列AM3352/AM3354/AM3359核心板规格书

    1 核心板简介 创龙科技SOM-TL335x-S是一款基于TI Sitara系列AM3352/AM3354/AM3359 ARM Cortex-A8高性能低功耗处理器设计的低成本工业级核心板,通过邮票 ...

  5. SpringBoot 1.x 2.x配置文件指定服务项目名

    SpringBoot版本1.x: server.context-path=/demo SpringBoot版本2.x: server.servlet.context-path=/demo

  6. 使用libzip压缩文件和文件夹

    简单说说自己遇到的坑: 分清楚三个组件:zlib.minizip和libzip.zlib是底层和最基础的C库,用于使用Deflate算法压缩和解压缩文件流或者单个文件,但是如果要压缩文件夹就很麻烦,主 ...

  7. 全网最适合入门的面向对象编程教程:02 类和对象的Python实现-使用Python创建类

    全网最适合入门的面向对象编程教程:02 类和对象的 Python 实现-使用 Python 创建类 摘要 本文主要介绍了串口通信协议的基本概念.串口通信的基本流程.如何使用 Python 语言创建一个 ...

  8. Serverless无服务应用架构纵横谈2:边缘计算激战正酣

    Serverless无服务应用架构纵横谈2 前言 6年前,我写了一篇<Serverless无服务应用架构纵横谈>. 文中说到无论是公有云FaaS还是私有云FaaS,都不是云计算的未来. 因 ...

  9. 存储器与CPU的连接

    存储器与CPU连接分主要看前五步 1.首先根据给出的地址范围写出二进制码 2.确定芯片的类型和数量 3.确定地址线 4.确定片选信号 要注意MREQ是低电平有效,要连到138译码器的低电平

  10. Apache Hudi X Apache Kyuubi,中国移动云湖仓一体的探索与实践

    分享嘉宾:孙方彬 中国移动云能力中心 软件开发工程师 编辑整理:Hoh Xil 出品平台:DataFunTalk 导读:在云原生 + 大数据的时代,随着业务数据量的爆炸式增长以及对高时效性的要求,云原 ...