Dockerfile构建镜像读取环境变量问题

2023-05-16

起初使用如下Dockerfile构建Java镜像:

FROM 10.170.33.245/base/openjdk:11.0.6-jdk-slim-buster
 
MAINTAINER luo.hq <luo.hq@neusoft.com>
 
ENV TZ "Asia/Shanghai"
ENV TERM xterm
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
ENV JVM_OPTIONS ""
ENV APP_ARGS ""
 
ADD quickstart-gateway/target/*.jar /app.jar
 
EXPOSE 8080
 
# 重点关注此ENTRYPOINT设置
ENTRYPOINT ["sh", "-c", "java ${JVM_OPTIONS} ${APP_ARGS} -Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom -Duser.timezone=Asia/Shanghai -jar /app.jar"]

在CNAP K8S Deployment运行此Java镜像时,发现类似spring.output.ansi.enabled环境变量无法注入,即启动Java镜像后在Java应用无法读取到对应的环境变量配置。
在这里插入图片描述
经测试发现shell环境(即sh -c环境)不支持小写点分环境变量名称的格式,即xxx.yyy的格式。
可通过将spring.output.ansi.enabled调整为SPRING_OUTPUT_ANSI_ENABLED,此时即可正常注入。
若能接受SPRING_OUTPUT_ANSI_ENABLED这种大写+下划线的形式,则此问题已解决。

若想支持spring.output.ansi.enabled这种小写点分环境变量的注入,给出最终方案(使用bash环境)如下:

# 调整ENTRYPOINT,
# 1)即使用bash -c环境
# 2)后面的java运行命令放在同一个"..."中,若拆分成多个则启动报错
ENTRYPOINT ["bash", "-c", "java ${JVM_OPTIONS} ${APP_ARGS} -Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom -Duser.timezone=Asia/Shanghai -jar /app.jar"]

注:
并非所有的基础镜像均支持"bash"(Bourne-Again Shell),但几乎全部镜像均支持"sh"(Bourne Shell)。
因此,使用上述方法时,请确保基础镜像中的"bash"可用。

相关Dockerfile Entrypoint启动命令对环境变量解析的支持情况汇总如下表:

ENTRYPOINT设置支持解析Dockerfile ENV环境变量,
如ENV JVM_OPTIONS “”
支持读取小写点分环境变量,
如spring.output.ansi.enabled格式
ENTRYPOINT [“sh”, “-c”, “java ${JVM_OPTIONS} -jar /app.jar”]
ENTRYPOINT java ${JVM_OPTIONS} -jar /app.jar
ENTRYPOINT [“java”, “${JVM_OPTIONS}”, “-jar”, “/app.jar”]
启动报错,将${JVM_OPTIONS}作为main class
ENTRYPOINT [“bash”, “-c”, “java ${JVM_OPTIONS} -jar /app.jar”]

注: 其中 [“sh”, “-c”, “…”] 和 [“bash”, “-c”, “…”] 模式均需将后续命令合并到同一个"…"中,否则启动报错。


参考:
https://docs.docker.com/engine/reference/builder/#environment-replacement
https://docs.docker.com/engine/reference/builder/#cmd
https://docs.docker.com/engine/reference/builder/#entrypoint
https://aws.amazon.com/cn/blogs/china/demystifying-entrypoint-cmd-docker/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile构建镜像读取环境变量问题 的相关文章

随机推荐

  • 基于openldap查询AD用户的组信息,上代码

    当用户找不到时 xff0c 这里的ldap result会卡住 xff0c 设置tm sec 为1也不行 需要继续定位 同样系统上官方的ldapsearch程序没有这个问题 span class token comment gcc ldap
  • linux 下记录ssh的操作日志

    ssh name 64 x x x x tee a log log tee可以读取标准输入输出的数据 xff0c 将其写到文件中
  • 云安全做什么?

    现在还说不清楚 xff0c 留下标题 xff0c 等能说清楚了后再补充
  • 用jpcap读取pcap抓包文件并做简单的过滤显示

    已经完成了最简单的从pcap文件中读取每个报文 xff0c 然后再转换成文本格式显示报文头信息 xff0c 以便于后面分析用 xff0c 这里做了简单的过滤 xff0c 根据源目的ip地址 xff0c 或者查找tcp没有响应的报文 以后又空
  • 【吐血整理】Java项目源码分享

    java servlet 43 jsp 43 bean开发开源宅商城系统 xff0c 未用任何java开源框架 实例 xff08 七 xff09 xff0c 电商书店 xff0c 源码下载 xff1a jsp 43 servlet仿当当网电
  • django操作数据库使用中文的方法

    今天在学习django时 xff0c 向mysql中写入数据 xff0c 结果提示错误 django db utils DatabaseError 1366 34 Incorrect string value 39 在网上找了很多资料 xf
  • simple_html_dom使用小结

    简单范例 lt php include 34 simple html dom php 34 Create DOM from URL or file html 61 file get html 39 http www google com 3
  • 启动Tomcat服务报错,端口占用解决方案

    启动Tomcat服务器报错 xff1a Several ports 8005 8080 8009 required by Tomcat v5 5 Server at localhost are already in use The serv
  • 人脸识别经典算法一:特征脸方法(Eigenface)

    这篇文章是撸主要介绍人脸识别经典方法的第一篇 xff0c 后续会有其他方法更新 特征脸方法基本是将人脸识别推向真正可用的第一种方法 xff0c 了解一下还是很有必要的 特征脸用到的理论基础PCA在另一篇博客里 xff1a 特征脸 Eigen
  • 装系统问题,BIOS显示不出硬盘解决方案

    原创作品 转载请注明出处 谢谢 杨福星 http blog csdn net luckystar92 article details 51265484 一 背景 华硕电脑 原装win8系统 改装win7系统出现BIOS显示不出硬盘问题 能进
  • 2014年计算机求职总结--准备篇

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 13000431 找工作是一个长期准备的过程 xff0c 突击是没什
  • Spring框架---全面详解【无比详细,学习总结】

    Spring框架 一 IoC 1 Spring的目标 集成 整合 优势 xff1a 解耦合 侵入小 轻量级 2 IoC控制反转 将控制权 xff08 创建对象 xff09 从调用方转义到Spring容器 以前对象的创建是由我们开发人员自己维
  • 关于kali gnome-tweaks-tool无法找到命令问题

    输入gnome tweaks即可
  • 在 Ubuntu 中添加新用户并给予 root 权限

    在 Ubuntu 中添加新用户并给予 root 权限的步骤如下 xff1a 打开终端 xff0c 以 root 身份登录 sudo su 使用 adduser 命令添加新用户 adduser username 为新用户设置密码 passwd
  • tensorflow载入数据的三种方式

    Tensorflow数据读取有三种方式 xff1a Preloaded data 预加载数据Feeding Python产生数据 xff0c 再把数据喂给后端 Reading from file 从文件中直接读取 这三种有读取方式有什么区别
  • 网络数据包封装与解封装基本过程

    数据包 应用层 TCP头 xff1a 源端口 43 目的端口 数据包 传输层 IP头 xff1a 源 IP 地址 43 目的 IP 地址 TCP头 xff1a 源端口 43 目的端口 数据包 网络层 Ethernet头 xff1a 源 MA
  • 环形缓冲区

    什么是环形缓冲区 在通信程序中 xff0c 经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据 环形缓冲区是一个先进先出 的循环缓冲区 xff0c 可以向通信程序提供对缓冲区的互斥访问 环形缓冲区原理 环形缓冲区通常有一个读指针 和
  • win10蓝牙链接上的标准串行com口无法删除

    Bluetooth 链接上的标准串行设备 无法删除解决办法 一 原理 Windows系统每次使用蓝牙与手机 xff08 耳机等蓝牙设备 xff09 配对时 xff0c 就会自动分配一个串口 xff0c 如果该蓝牙设备一直处于保留状态 xff
  • 创新工场两道笔试题0919

    题目1 字符串去重 xff0c 老题目 xff0c 只是要求不能开辟新空间用来复制原字符串 思路 xff1a 使用布尔型的简单hash表可以节省空间 xff0c 用来存储字符是否出现的信息 xff0c 刚开始hash表里面都是false x
  • Dockerfile构建镜像读取环境变量问题

    起初使用如下Dockerfile构建Java镜像 xff1a FROM span class token number 10 170 span 33 245 base openjdk 11 0 6 jdk slim buster MAINT