性价比最高的网站建设公司,企业自助建站,如何快速网络推广产品的方法,建设银行手机绑定网站问题一描述将docker容器通过docker export命令打包#xff0c;传输到另外的服务器#xff0c;再通过docker import命令导入后#xff0c;发现原来docker容器中的环境变量失效了。解决方案1. 【无效方案】直接在docker容器中通过export命令设置环境变量。export LD_LIBRARY_P… 问题一描述将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 -cll/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 importdocker 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 dancen10.17.1.11:/home/vsr_trt_20230215_save.tar/home/vsr_trt_20230215_save.tar 打包容器相关文件等cd /mnt/datatar -czvf enhancefox.tar enhancefoxscp -P 22 dancen10.17.1.11:/mnt/data/enhancefox.tar/mnt/data/enhancefox.tar 4. 导入镜像并创建容器。在新服务器上导入镜像docker load -i /home/vsr_trt_20230215_save.tar 解压容器相关文件等cd /mnt/datatar -xvf enhancefox.tar 创建新容器docker run -itd --gpus all --ipchost--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