docker启动时环境变量不生效(docker打包成镜像后环境变量失效)

news/2025/2/23 2:27:57/

前言

因项目需要多处部署,为了部署的方便,于是准备将项目环境打包成docker镜像以便于部署。mq、mysql这些在仓库中都有现成的镜像,虽然java和nginx的也都有,但是不知道当时是怎么想的,就不想搞太多镜像,也打算自己实践一下docker踩踩坑,就拉了个debian的环境自己配。

问题

按照网上的教程在容器中配置Java环境,这点没什么难的,学过Java的都能做到,我也确实成功了。然后在重启验证时发现环境变量失效了,然后在网上搜索时发现在/etc/profile中设置的环境变量每次进入时都需要source /etc/profile,这有些麻烦,然后找到了另外一种方式,可以把环境变量写入~/.bashrc中,每次打开新的shell时都会执行,听着就比较符合我们的要求了,然后重启以及重新进入shell都验证一下,发现Java环境都生效。
然后写个shell脚本,让容器在启动时运行我的各个服务,退出容器并打包成镜像。本以为大功告成了,谁知在测试镜像能否正常运行我的各个服务时报错了,又是Java环境问题。但是之前已经验证过环境没问题,进入容器查看Java环境发现一切正常,没有问题。于是退出容器重启,结果还是因为没有Java环境报错,这就很奇怪了,有点像量子力学了,观察就有,不观察就没有。
既然是shell脚本运行的时候没有Java环境,那我们可以在脚本中配置Java环境就能解决这个问题,确实也有不少执行脚本都这么做,但是我还是想知道环境变量为什么失效。

解决思路

首先怀疑的肯定是加载顺序,自己写的脚本执行得比~/.bashrc快。那么在init.sh中写入以下内容。
在这里插入图片描述
在~/.bashrc中写入以下内容
在这里插入图片描述
然后把容器提交成镜像后启动镜像docker run -itd config_init_test:2.0 /init.sh
在Docker Desktop中发现压根就没执行~/.bashrc中的内容
在这里插入图片描述
顺着~/.bashrc中的命令没有执行这个线索去查,仔细阅读之后才意识到我在上面加粗的那句“每次打开新的shell时都会执行,那不打开shell就不会执行,而绝大多数运行镜像的场景都是后台运行,不会打开shell,环境变量的设置理所当然的失效。

解决方案

1、在shell脚本设置环境变量
2、在Dockerfile中使用ENV命令
一开始我是用的方案2,但是语法没写对导致我以为这种用法不行才换的写入~/.bashrc这个方案,然后就踩了这个坑。。。

总结

对Linux不熟悉,平时接触得也少,这算是Linux的基础知识吧,没事还是多学学基础知识,特别是想要用好docker的话Linux基础知识必不可少。


http://www.ppmy.cn/news/1380141.html

相关文章

MySQL8.0安装教程+使用Navicat远程连接

MySQL8.0安装教程使用Navicat远程连接 版本:MySQL8.0.28 环境:Windows11 1.MySQL下载 进入官网https://www.mysql.com/进行下载: 2.安装MySQL 下载好后,点击运行程序开始安装,安装步骤如下: 以下步骤验…

使用QEMU来模拟运行Linux系统

第一步:安装 执行命令 假设我们呢开发板需要arm64架构的Ubuntu 得通过apt-file去找,可以找到qemu-system-arm 所以直接按照qemu-system-arm就行了 apt-file list会列举这个软件包里所有的文件 这个命令可以列举出所有安装好的包名,有点像pip…

Biomedical Signal Processing and Control投稿经验

期刊:Biomedical Signal Processing and Control 影响因子:5.1 中科院分区:2区 投稿经历: 2023年10月4号提交 2023年10月17号送外审:送了16人,有6人接受审稿 2023年11月12号大修:六十多条意见&…

MR混合现实情景实训教学系统模拟高空作业情景

MR混合现实情景实训教学系统,通过精确的三维建模和高动态范围渲染,将真实的高空环境生动地呈现在课堂上。学生可以在虚拟环境中进行模拟操作,如攀爬绳索、悬挂作业等,从而更好地理解和掌握高空作业的技巧和安全规范。同时&#xf…

ThreadLocal是什么,ThreadLocal源码分析,ThreadLocal应用,ThreadLocal内存泄漏

ThreadLocal是什么,ThreadLocal源码分析,ThreadLocal应用,ThreadLocal内存泄漏 目录 本文导读 一、ThreadLocal概述 二、ThreadLocal源码解析 三、ThreadLocal在多线程并发中的应用 四、ThreadLocal与内存泄漏问题 总结 博主v&#xf…

Pandas教程16:DataFrame列标题批量重命名+空df数据判断+列名顺序重排

---------------pandas数据分析集合--------------- Python教程71:学习Pandas中一维数组Series Python教程74:Pandas中DataFrame数据创建方法及缺失值与重复值处理 Pandas数据化分析,DataFrame行列索引数据的选取,增加&#xff0c…

阿里云服务器8核16G配置多少钱?2024年活动价格及收费标准价格表

阿里云服务器8核16G配置2024年需要多少钱?8核16G配置的阿里云服务器选择不同实例规格和地域,其收费标准和活动价格都是不一样的,2024年3月1日,阿里云率先宣布云产品大规模调价,其中云服务器最高降幅达36%,因…

无人机手持地面站软件功能详解,无人机手持地面站软件开发人员组成及成本分析

无人机手持地面站软件是专为无人机操控和任务管理设计的移动应用,它通常集成在智能手机、平板电脑或其他便携式设备上,使得用户可以在远离无人机的地方对飞行器进行实时监控与远程控制。 主要功能详解: 1. 飞行控制与姿态显示: …