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

news2025/1/10 17:44:49

前言

因项目需要多处部署,为了部署的方便,于是准备将项目环境打包成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.coloradmin.cn/o/1508644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五、OpenAI实战之Assistants API

在8线小城的革委会办公室里,黑8和革委会主任的对话再次展开。 黑8:主任,您知道吗?除了OpenAI API,现在还有一项新的技术叫做Assistants API,它可以帮助我们更好地进行对话和沟通。 主任:Assis…

Redhat Linux(RHEL) - Primavera P6 EPPM 安装及分享

引言 继上一期发布的Oracle Linux版环境发布之后,近日我又制作了基于Redhat Linux 的P6虚拟机环境,同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机,请先与Oracle Primavera销售代表…

SD-WAN能解决企业网络的哪些问题?

SD-WAN技术的崛起为企业网络带来了全新的解决方案。在数字化转型、云计算、远程办公和5G等领域,SD-WAN技术展现出强劲的市场趋势。那么,SD-WAN究竟能够解决企业网络中的哪些难题呢? 提升网络带宽利用率 传统网络在连接分支机构时,…

解决input事件监听拼音输入法导致高频事件

1、业务场景 在文本框中输入内容,执行查询接口,但遇到一个问题,当用拼音打字写汉字去搜索的时候,会输入一些字母拼成汉字,怎么能监听等拼音文字输入完成后再触发文本框监听事件 2、解决方案 通过查阅资料得知在输入中…

Qt教程 — 1.3 如何创建Qt项目

目录 1 新建一个项目 2 项目文件介绍 2.1 项目文件夹介绍 2.2 配置文件*.pro 2.3 头文件*.h 2.4 源文件*.cpp 2.5 样式文件*.ui 3 修改 ui 文件 4 项目编译&调试&运行 4.1 运行 4.2 编译报错 1 新建一个项目 (1) 新建项目,方法一:打…

Docker Desktop将镜像存储位置从C盘迁移到其它盘

一、简述 Docker Desktop默认安装在C盘,默认镜像存储位置在 C:\用户\Administrator\AppData\Local\Docker\wsl Docker Desktop 通过WSL2启动,会自动创建2个子系统,分别对应2个 vhdx 硬盘映像文件。 可以命令行执行wsl --list -v 看到 二、迁移步骤 1、在Docker Desktop…

基于jsp+mysql+Spring+mybatis的SSM汽车保险理赔管理系统设计和实现

基于jspmysqlSpringmybatis的SSM汽车保险理赔管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…

C++ 之LeetCode刷题记录(三十九)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 目标:执行用时击败90%以上使用 C 的用户。 22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用…

在文件夹下快速创建vue项目搭建vue框架详细步骤

一、首先在你的电脑目录下新建一个文件夹 进入该文件夹并打开控制台(输入cmd指令) 进入控制台后输入 vue create springboot_vue (自己指定名称) 如果出现这类报错如:npm install 的报错npm ERR! network request to http://registry.cnp…

【JAVA重要知识 | 第八篇】Java注解总结

文章目录 8.注解8.1注解的定义8.1.1何为注解?8.1.2何为元数据和元编程?(1)元数据(2)元编程(3)总结 8.2注解的分类8.2.1常用的注解8.2.2自定义注解8.2.3元注解(1&#xff…

轻松掌握锁冲突问题的排查方法——《OceanBase诊断系列》之八

1. 前言 OceanBase数据库通过两阶段封锁机制确保读写事务并发控制的正确性。在高冲突场景下,事务处理中经常会遇到行锁冲突的问题。然而,许多OceanBase用户对于何时发生锁冲突,锁冲突的表现如何,以及如何排查锁冲突的原因&#x…

python爬虫(6)之处理数组

1、拆分数组 1、spilt()函数 此函数的用处是将数组均分成几个数组 演示如下: import numpy as np ac np.array([1,2,8,9,3,5,5,8]) ac1 np.split(ac,2) ac2 np.split(ac,[3,6]) print(ac1,ac2) 结果如下: 其中若是一个数…

【计算机视觉】目标跟踪任务概述和算法介绍

一、前言 1.1:目标跟踪VS目标检测:区别和联系 区别: 任务目标 目标跟踪任务的目标是在视频序列中跟踪一个特定目标的位置,即给定第一帧中的目标位置后,在后续帧中确定目标的位置。而目标检测任务的目标是在静态图像中…

解决 Node.js 中 npm ERR! errno CERT_HAS_EXPIRED问题

出自 BV1MN411y7pw, P94 黑马AJAX-Node.js-Webpack教学视频中npm包下载dayjs出错情况 输入 npm i dayjs指令之后出错: npm ERR! errno CERT_HAS_EXPIREDnpm ERR! A complete log of this run can be found in: C:\Users\24541\AppData\Local\npm-cache…

【leetcode C++】最小栈

leetcode 155. 最小栈 题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获…

lspci详解

lspci的作用 lspci是一个Linux命令,用于列出系统中的PCI总线设备信息。PCI(Peripheral Component Interconnect)是一种常见的计算机总线标准,用于连接各种外部设备(如网卡、显卡、声卡等)到计算机主板上。…

【CVPR2024】ReID3D:首个使用激光雷达行人充实别 ReID 的工作!

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作! 摘要:数据集:方法模型:多任务预训练:ReID Network: 实验结果:结论: 来源:Arxiv 2023…

mysql中 COALESCE和CASE WHEN的使用以及创建或替换视图

create or replace view 自理能力评估视图 as SELECT ehr_zlnlpg.ID AS ID, ehr_zlnlpg.GRID AS GRID, ehr_zlnlpg.TJID AS TJID, ehr_grjbxx.Name AS 姓名, ehr_grjbxx.Sex AS 性别, ehr_grjbxx.Cardnum AS 身份证号, ehr_zlnlpg.SCORESUM AS 总…

设计模式学习笔记 - 规范与重构 - 5.如何通过封装、抽象、模块化、中间层解耦代码?

前言 《规范与重构 - 1.什么情况下要重构?重构什么?又该如何重构?》讲过,重构可以分为大规模高层重构(简称 “大型重构”)和小规模低层次重构(简称 “小型重构”)。大型重构是对系统…

UI自动化测试使用场景及脚本录制

经常有人会问,什么样的项目才适合进行UI自动化测试呢?UI自动化测试相当于模拟手工测试,通过程序去操作页面上的控件。而在实际测试过程中,经常会遇到无法找到控件,或者因控件定义变更而带来的维护成本等问题。 哪些场…