Docker迁移以及环境变量问题

这篇具有很好参考价值的文章主要介绍了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 exec -it …
但以非交互方式执行docker命令时,执行命令“command not found”:
docker exec container /bin/bash -c "python …"

解决方案


这同样是一个环境变量问题。
查看docker中用户目录下的.bashrc文件,在文档前面几行就会看到如下一行内容:
[ -z "$PS1" ] && return

PS1是交互式SHELL的命令提示符,在非交互式的情况下,该值为空。本行的意思是,如果是非交互式的调用shell,则返回不再继续往下执行,即后面的环境变量设置都将不被执行。

将改行注释掉以后,能够成功以非交互方式执行docker容器中的命令。
 文章来源地址https://www.toymoban.com/news/detail-676016.html

到了这里,关于Docker迁移以及环境变量问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • windows环境下docker数据迁移到其他盘

             docker安装在C盘,使用一段时间后,C盘爆满。因此想把C盘中的数据迁移到其他盘,以释放C盘空间。分为以下步骤: 1、启动docker软件 ,打开PowerShell并切换到Docker Compose配置文件的目录。         Docker Compose配置文件的目录通常位于你的项目根目录中,也就是包

    2024年02月15日
    浏览(90)
  • 【运维知识大神篇】运维人必学的Docker教程1(Docker安装部署+Docker镜像管理+容器管理常用命令+搭建docker的本地yum源+windows系统安装docker环境)

    本篇文章开始给大家介绍Docker,这个是我非常喜欢的一个服务,介绍给大家,希望大家也能喜欢! 目录 何为容器 Docker环境安装部署 一、yum安装(CentOS7.9) 二、rpm包安装(CentOS) 三、卸载docker环境 四、安装指定的docker版本 五、Ubuntu安装docker环境 六、使用deb安装docker 七、

    2024年01月18日
    浏览(110)
  • Docker - 设置环境变量

    --env 或者 -e 指定docker的环境变量 key=value 方式一 docker inspect 命令来查看 如果是Windows的话可以用可视化界面,原理一样。 方式二 docker exec 容器id env

    2024年02月11日
    浏览(52)
  • Docker环境变量设置

    docker run 命令中设置环境变量 Dockerfile 中使用 ENV 指令设置环境变量 查看环境变量

    2024年02月09日
    浏览(40)
  • Docker设置获取环境变量

    在构建Docker镜像时,可以在Dockerfile中使用ENV指令来设置环境变量 ENV 指令用于设置环境变量,语法为 ENV key value ENV key=value 使用docker run命令在运行容器时设置环境变量。 -e、--env 选项用于设置环境变量,语法为 -e key=value  --env-file 选项用于设置环境变量文件,格式如下: DB

    2024年04月12日
    浏览(36)
  • Docker Compose 配置环境变量

    在 Docker Compose 中, 可以通过 environment 字段来设置环境变量. 可以在 docker-compose.yml 文件中的服务定义中添加以下行来设置环境变量: 在这个例子中, myservice 服务的环境变量 MY_VAR 的值被设置为 myvalue. 可以根据需要添加多个环境变量. 如果想要从一个 .env 文件中加载环境变量, 可

    2024年03月12日
    浏览(44)
  • 【Docker】Docker的应用包含Sandbox、PaaS、Open Solution以及IT运维概念的详细讲解

    前言   Docker 是一个 开源的应用容器引擎 ,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux或Windows 操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介: 热爱跑步的恒川 ,致

    2024年02月08日
    浏览(42)
  • Docker Desktop 设置镜像环境变量

    点击run 展开Optional settings container name :容器名称 Ports:根据你需要的端口进行输入,不输入则默认 后面这个 比如我这个 5432 Volumes:卷,也就是做持久化 需要docker 数据保存的地方 Environment variables:环境变量,也就是启动时需要输入的参数,比如我这个 PGSql需要设置密码,就

    2024年02月07日
    浏览(48)
  • windows docker mysql8.0 挂载配置文件不生效的问题

    原因 mysql 8.0 遇到sql_mode=only_full_group_by的问题,于是就自定义my.cnf 去掉only_full_group_by,修改my.cnf 文件后,进行映射启动 docker run 命令 docker run -p 3306:3306 --privileged=true --restart=always -d --name axsc-mysql -v E:/docker/mysql8.0/log:/var/log/mysql -v E:/docker/mysql8.0/data:/var/lib/mysql -v E:/docker/mysql8.0

    2024年02月13日
    浏览(52)
  • 潦草的记录docker 容器修改/etc/hosts文件不生效的问题

    使用命令 RUN echo -e “host:ip” /etc/hosts 不生效 以为是命令太长了,没有执行;修改为将域名放到脚本中上传,然后执行,发现还是不行 登入容器,直接执行,是成功的,怀疑是没有权限。 在Dockerfile中增加赋权语句,还是失败 最终的解决方法:docker run --add-host=myhost:192.168.0

    2024年01月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包