docker启动时环境变量不生效的解决方法
前言
因项目需要多处部署,为了部署的方便,于是准备将项目环境打包成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基础知识必不可少。
到此这篇关于docker启动时环境变量不生效的解决方法的文章就介绍到这了,更多相关docker启动时环境变量不生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
docker compose入门helloworld的详细过程
docker-compose是基于docker的,所以我们需要先安装docker才能使用docker-compose,接下来通过本文给大家介绍docker compose入门helloworld的过程,一起看看吧2021-09-09
最新评论