当前位置: 首页 > 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 脚本结构 脚本(执行查询…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

面试高频问题

文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC&#xf…...