当前位置: 首页 > news >正文

Docker迁移以及环境变量问题

问题一描述

将docker容器通过docker export命令打包,传输到另外的服务器,再通过docker import命令导入后,发现原来docker容器中的环境变量失效了。

解决方案

1. 【无效方案】直接在docker容器中通过export命令设置环境变量。

export LD_LIBRARY_PATH=/home/shared/TensorRT-8.2.4.2/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64

显然,export命令配置的环境变量只能临时生效,重新进入容器后环境变量失效。

2. 【无效方案】在docker容器的/etc/profile中配置环境变量。

a. 在docker容器中,在/etc/profile的末尾添加环境变量配置:

export LD_LIBRARY_PATH=/home/shared/TensorRT-8.2.4.2/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64

b. 然后执行环境变量刷新:

source /etc/profile

在/etc/profile中配置环境变量是令环境变量永久生效的通用做法,但对于docker,这一做法失败了,表现为,重新进入docker后,环境变量失效,并且重启docker容器同样无效。

3. 【有效方案】在docker容器的/root/.bashrc中配置环境变量。

在docker容器中,在/root/.bashrc的末尾添加环境变量配置:

export LD_LIBRARY_PATH=/home/shared/TensorRT-8.2.4.2/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64

重新进入容器,可以发现环境变量保持生效。

4. 【有效方案】该方案为方案2的改进版。

在docker容器的/etc/profile中配置环境变量,然后在/etc/bash.bashrc或/etc/bashrc中增加环境变量刷新命令。

a. 在docker容器中,在/etc/profile的末尾添加环境变量配置:

export LD_LIBRARY_PATH=/home/shared/TensorRT-8.2.4.2/lib:/usr/local/nvidia/lib:/usr/local/nvidia/lib64

b. 在/etc/bash.bashrc或/etc/bashrc的文件末尾增加环境变量刷新命令:

source /etc/profile

问题二描述

将docker容器通过docker export命令打包,传输到另外的服务器,再通过docker import命令导入后,发现在docker容器外部无法执行docker容器中的命令,而原始的,export之前的docker,则不存在此问题。

例如:在docker容器中,可以正常执行python、ll等命令,但在dockers外部,则会出现command not found错误。

docker exec gpu21 /bin/bash -c"ll"

/bin/bash: ll: command not found

docker exec gpu21 /bin/bash -c "cd/home/server && ./start.sh"

/bin/bash: python: command not found

解决方案

1. 【有效方案】直接在docker容器中对应的脚步中通过export命令设置环境变量。

简单分析可以认为,在docker容器中,bash能够正常找到执行程序,而在docker外部,bash找不到执行程序,所以还是环境变量的PATH变量的问题,并且是PATH变量的值在容器中是正确的,而在容器外部调用bash执行命令时,PATH变量失效。

暂时能想到的解决方案是,直接在docker中需要执行的脚本里边再次设定环境变量。例如,对于以下执行需求:

docker exec gpu21 /bin/bash -c "cd/home/server && ./start.sh"

/bin/bash: python: command not found

我们可以直接进入容器,查看PATH变量的值:

echo $PATH

/root/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

以及查看在容器外部执行时PATH变量的值:

docker exec gpu21 /bin/bash -c "echo$PATH"

/usr/local/cuda-11.2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

可以发现两者并不一致,这也正是问题所在。我们可以改写start.sh脚本,在脚本的开始处添加设置环境变量的内容,使得在容器外部时PATH变量的值与docker容器内部一致。

在start.sh文件的开头处添加以下内容:

exportPATH=/root/anaconda3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

再次在容器外部执行start.sh,发现可以成功执行了:

docker exec gpu21 /bin/bash -c "cd/home/server && ./start.sh"

终极解决方案

在传递docker镜像时,请避免使用

docker export

命令;请改用

docker save

命令,已避免可能出现的环境变量问题。

两者区别在于:

docker export命令针对容器执行,对应的,导入命令为:

docker import

docker save命令针对镜像执行,对应的,导入命令为:

docker load

容器迁移步骤

以如下容器为例:

b379e350987d vsr_trt "/bin/bash" 6 weeks ago Up 6 weeks enhancefox

容器名称为enhancefox,其镜像为vsr_trt,迁移镜像的操作步骤如下:

1. 通过容器创建新的镜像。

如果容器在原镜像的基础之上有变更,需提交变更,创建一个新版本的镜像。

docker commit enhancefox vsr_trt:20230215

这里我们将容器enhancefox在通过原镜像vsr_trt创建之后可能产生的变更进行提交,创建版本号为20230215的新镜像。

2. 保存镜像。

docker save vsr_trt:20230215 > /home/vsr_trt_20230215_save.tar

3. 传递镜像和容器。

将保存的镜像传递至新的服务器,在新的服务器上执行:

scp -P 22 dancen@10.17.1.11:/home/vsr_trt_20230215_save.tar/home/vsr_trt_20230215_save.tar

打包容器相关文件等:

cd /mnt/data

tar -czvf enhancefox.tar enhancefox

scp -P 22 dancen@10.17.1.11:/mnt/data/enhancefox.tar/mnt/data/enhancefox.tar

4. 导入镜像并创建容器。

在新服务器上导入镜像:

docker load -i /home/vsr_trt_20230215_save.tar

解压容器相关文件等:

cd /mnt/data

tar -xvf enhancefox.tar

创建新容器:

docker run -itd --gpus all --ipc=host--network host -p 9501:9501 -v /mnt/data/enhancefox:/home/server -v/etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime --name enhancefoxvsr_trt:20230215

相关文章:

Docker迁移以及环境变量问题

问题一描述将docker容器通过docker export命令打包,传输到另外的服务器,再通过docker import命令导入后,发现原来docker容器中的环境变量失效了。解决方案1. 【无效方案】直接在docker容器中通过export命令设置环境变量。export LD_LIBRARY_P…...

Sphinx文档生成工具(二)

rst语法 官方的语法手册 行内的样式: #斜体 *message* #粗体 **message** #等宽 不能有换行 message标题 一级标题 ^^^^^^^^ 二级标题 --------- 三级标题 >>>>>>>>> 四级标题 ::::::::: 五级标题六级标题 """"…...

Python快速上手系列--JSON--入门篇

本章我们来看看json的一些应用。简单易懂还实用。一起来看看数据类型以及一些语法规则吧1、数字(整数或浮点数) 如:{"age":18, "score":70.5} 注意,数字直接写,不需要带任何符号2、字符串&#xf…...

axios中的GET POST PUT PATCH,发送请求时params和data的区别

axios 中 get/post请求方式 1. 前言 最近突然发现post请求可以使用params方式传值,然后想总结一下其中的用法。 2.1 分类 经过查阅资料,get请求是可以通过body传输数据的,但是许多工具类并不支持此功能。 在postman中,选择get请…...

hume项目k8s的改造

hume项目k8s的改造 一、修改构建目录结构 1、在根目录下添加build-work文件夹 目录结构如下 [rootk8s-worker-01 build-work]# tree . . ├── Dockerfile ├── hume │ └── start.sh └── Jenkinsfile2、每个文件内容如下 Dockerfile FROM ccr.ccs.tencentyun…...

MACD红二波选股公式,选出MACD二次翻红的标的

经过一段上涨行情之后,市场出现了时间稍长或者幅度稍大的调整,MACD指标的DIF、DEA会出现死叉,柱线由红色转变为绿色。 而调整时间较短或者幅度较小,MACD红柱会缩短,但不出现绿柱,之后红柱开始变长&#xff…...

mac上安装mysql

mac上安装mysql1. 关于Linux上安装mysql2. 下载安装2.1 下载2.2 安装3. 客户端连接mysql3.1 先查看mysql服务3.2 连接mysql客户端3.2.1 终端使用命令连接3.2.2 可视化工具连接3.3 其他简单操作(启动服务等)3.3.1 可视化界面操作4. 配置环境变量4.1 配置环…...

Django 模型继承问题

文章目录Django 模型继承问题继承出现的情况Meta 和多表继承Meta 和多表继承继承与反向关系指定父类连接字段代理模型QuerySet 仍会返回请求的模型基类约束代理模型管理器代理继承和未托管的模型间的区别多重继承不能用字段名 "hiding"在一个包中管理模型Django 模型…...

Vue3篇.01-简介及基本使用,项目创建方式, 模板语法, 事件监听, 修饰符

一.简介1.概念Vue 是一款用于构建用户界面的 JS框架, 基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型, 高效地开发用户界面。渐进式框架, 适应不同需求进行开发。两个核心功能:声明式…...

别学英语了,真的

文 / 王不留(微信公众号:王不留) 这两年,很多朋友加我微信后,第一句常是,学英语有什么用啊? 我会统一给出真诚答复:没用,真的。 看新闻,中文海量信息已经严重…...

CRM系统五大技巧集成Excel为销售流程赋能

销售过程中有很多情况会降低团队的效率。通过正确的实施CRM客户管理系统,可以帮助您的企业自动执行手动任务、减少错误并专注于完成交易。这里有5个技巧,可以帮助您的销售人员通过CRM集成Excel为销售流程赋能并提高他们的整体效率。 技巧1:将…...

交通部互通互联码的根证书规则

引言 为了更好的服务交通互通互联码而更新这篇文章。 中金根证书其实是可以自己生成的。 代码内调整 中心公钥索引要保证自己的唯一性。 此处的唯一,是要保证在机具侧的唯一,因为他要根据这个索引去查找证书以及公钥。 提供根公钥给机具侧 生成的公钥…...

Map和Set(Java详解)

在开始详解之前,先来看看集合的框架: 可以看到Set实现了Collection接口,而Map又是一个单独存在的接口。 而最下面又分别各有两个类,分别是TreeSet(Map)和 HashSet(Map)。 TreeSet&…...

Vue 3的响应式机制

什么是响应式 Js代码是自上而下执行的,结合下面代码看,代码执行后,会打印两次double的结果,结果也都是2,即使修改了代码中count的值后,double的值也不会发生任何改变。 let count 1 let double count * …...

30岁了,说几句大实话

是的,我 30 岁了,还是周岁。 就在这上个月末,我度过了自己 30 岁的生日。 都说三十而立,要对自己有一个正确的认识,明确自己以后想做什么,能做什么。 想想时间,过得真快。 过五关斩六将&…...

AsyncTask使用及源码查看Android P

AsyncTask AsyncTask用于处理耗时任务,可以即时通知进度,最终返回结果。可以用于下载等处理。 使用 实现类继承三个方法 1. doInBackground后台执行,在此方法中进行延时操作 /*** Override this method to perform a computation on a back…...

花2个月面过华为测开岗,拿个30K不过分吧?

背景介绍 美本计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三暑假回国的时间比较短(小于两个月),于是找的实…...

JAVA练习51-最大子数组和

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-最大子数组和 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 2月15日练…...

Inception Transformer

paper链接: https://arxiv.org/abs/2205.12956v2 code链接: https://github.com/sail-sg/iFormer Inception Transformer一、引言二、实现细节三、实验一、分类二、检测三、分割四、消融实验一、引言 最近的研究表明,Transformer具有很强的建立远程依赖关系的能力…...

10分钟学会数据库压力测试,你敢信?

目录 前言 查看数据库版本 下载驱动: 菜单路径 配置 Variable Name Bound to Pool模块配置 Connection pool configuration模块配置 Database Connection Configuration模块配置 菜单路径 Variable Name Bound to Pool 脚本结构 脚本(执行查询…...

论文阅读 | Video Super-Resolution Transformer

引言:2021年用Transformer实现视频超分VSR的文章,改进了SA并在FFN中加入了光流引导 论文:【here】 代码:【here】 Video Super-Resolution Transformer 引言 视频超分中有一组待超分的图片,因此视频超分也经常被看做…...

7-6 带头节点的双向循环链表操作

本题目要求读入一系列整数,依次插入到双向循环链表的头部和尾部,然后顺序和逆序输出链表。 链表节点类型可以定义为 typedef int DataType; typedef struct LinkedNode{DataType data;struct LinkedNode *prev;struct LinkedNode *next; }LinkedNode;链…...

npm publish 、 npm adduser 提示 403 的问题

0. 查看使用的源:npm config get registry1. 如果使用的不是官方的源,切换:npm config set registry https://registry.npmjs.org/2. 登录:npm adduser3. 查看是否登录成功:npm whoami4. 执行发布命令:npm …...

Java 8的函数式接口使用示例

什么是函数式接口 有且只有一个抽象方法的接口被称为函数式接口,函数式接口适用于函数式编程的场景,Lambda就是Java中函数式编程的体现,可以使用Lambda表达式创建一个函数式接口的对象,一定要确保接口中有且只有一个抽象方法&…...

2023年企业如何改善员工体验?为什么员工体验很重要?

什么是员工体验?大约 96% 的企业领导者表示,专注于员工体验可以更轻松地留住顶尖人才。[1] 这还不是全部。令人震惊的是,87%的企业领导者还表示,优先考虑员工的幸福感将给他们带来竞争优势。尽管有这些发现,但只有19%的…...

设计模式:桥接模式让抽象和实现解耦,各自独立变化

一、问题场景 现在对”不同手机类型“的 “不同品牌”实现操作编程(比如: 开机、关机、上网,打电话等) 二、传统解决方案 传统方案解决手机使用问题类图: 三、传统方案分析 传统方案解决手机操作问题分析 1、扩展性问题(类爆炸),如果我们…...

C++学习记录——십 STL初级认识、标准库string类

文章目录1、什么是STL2、STL简介3、什么是string类4、string类的常用接口说明1、常见构造函数2、容量操作3、迭代器4、其他的标准库的string类关于string类的内容,可以在cplusplus.com查看到。 1、什么是STL STL是C标准库的重要组成部分,不仅是一个可复…...

【redis】redis缓存与数据库的一致性

【redis】redis缓存与数据库的一致性【1】四种同步策略【2】更新缓存还是删除缓存(1)更新缓存(2)删除缓存【3】先更新数据库还是先删除缓存(1)出现失败时候的情况1-先删除缓存,再更新数据库&…...

XCP实战系列介绍12-基于Vector_Davinci工具的XCP配置介绍(一)

本文框架 1.概述2. EcuC配置2.1 Pdu添加步骤2.2 配置项说明3. Can 模块配置4. CanIf 模块配置4.1 接收帧的Hardware Receive Object配置4.2 接收帧和发送帧的Pdu配置1.概述 在文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,在《XCP实战系列介绍01-测量与标定底层逻辑》…...

Unity Material详解

一、创建 二、属性 1.Shader:Unity内置了一些shader,用户自定义的shader也在这里出现. Edit: 可以编辑一些shader可编辑的内容,如一些属性. 2.Rendering Mode:渲染模式 Opaque-不透明-石头适用于所有的不透明的物体Cutout-镂空-破布透明度只有0%和100…...

wordpress幻灯片名/手机怎么创建自己的网站平台

IntelliJ IDEA是Java语言开发的集成环境,IntelliJ在业界被公认为优秀的Java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、 创新的GUI设计等方面的功能可以说是超常的。IntelliJ IDEA现已更新至2019.…...

学校网站建设及使用/网站收录量

前言 回顾上篇的设计模式之-简单工厂模式 我们可以从中发现一些问题。 先看看以计算器为例的简单工厂的结构图如下&#xff1a; 那此时我们换成工厂模式呢&#xff1f;我们先看看工厂的结构图&#xff1a; 承接上篇计算器为例&#xff0c;我们需要新建一个工厂接口 /// <sum…...

网站建设应注意什么/张家口网站seo

目录 dubbo是什么 负载均衡算法 集群容错(容忍错误) Dubbo的SPI Java的SPI dubbo是什么 Dubbo是一个支持远程服务调用的分布式框架。 负载均衡算法 RandomLoadBalance:权重随机算法,根据权重值进行随机负载 RoundRobinLoadBalance:加权轮询算法 LeastActiveLoadBalance:最…...

wordpress 取消评论/免费seo教程

首先生成两张数据表,一般要实现两张数据表之间的联系要建立第三张表&#xff0c;如下 数据表生成之后&#xff0c;生成一些测试数据&#xff0c;接下来就对表article_tag表进行操作 在模型文件中声明两张表之间的关系&#xff1a; 测试数据&#xff1a; 转载于:https://www.cnb…...

做淘宝优惠券网站要多少钱/seo目标关键词优化

跨域错误 错误原因 解决方法在后台写一个过滤器过滤器来改写请求头头 CorsFilter.java public class CorsFilter implements Filter { Override public void init(FilterConfig filterConfig) throws ServletException { } Override public void doFilter(ServletRequest servl…...

网站建设 好牛/百度关键词搜索怎么收费

加了一个ensure_asciiFalse 就好了 json.dumps(data, ensure_asciiFalse)...