docker启动时环境变量不生效(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基础知识必不可少。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值