Docker 读取配置文件,设置环境变量

场景

工程中有一个xxx.properties的配置文件,里面有些环境变量,如数据库连接,文件目录等

同时有一个处理数据的shell脚本,里面也需要这部分环境变量

通常的做法是在写 Dockerfile 时,使用ENV xx xx的方式制定

但是,系统环境有多个,dev、test、release 等

不能针对每一个环境都去修改 Dockerfile 文件

于是乎就尝试使用 shell 脚本读取配置文件,将结果设置到环境变量中

步骤

1.按行读取配置文件

Linux 有多中按行读取文件的方式:awk,cat 等,我这里采用了 cat 的方式

cat /data/luelue.properties | while read line; do
     echo $line
done

这样就可以将数据读取出来

2.修改数据格式

luelue.properties 中的数据格式是

auther:shuai
url:jdbc:mysql://localhost:3306/liquibase?useSSL=false

但是 Linux 环境变量中的数据格式是

export auther=shuai
export url=jdbc:mysql://localhost:3306/liquibase?useSSL=false

因此我们要做的是:

  • 切分 luelue.properties 中的数据
  • 组装成 export xx=xx 的格式

2.1切分数据

Linux 有多种切分字符串的方式,这里我采用了 ${string#*chars}${string%chars*}的方式

string 是要截取的字符串

*是通配符的一种,表示任意长度的字符串

chars 是指定的字符(或者子字符串)

%、# 意思是从右向左、从左向右

针对auther:shuai 使用${line%:*} ${line#*:} 就可以截出auther shuai

但是url:jdbc:mysql://localhost:3306/liquibase?useSSL=false 截出的就是`url:jdbc:mysql://localhost: url

为什么呢?

因为单个#、%意思是:遇到第一个匹配的就停止

那么很显然,截取Key的时候,要使用${line%%:*}

2.2 拼装数据

使用:echo export ${line%%:*}"="${line#*:} 生成需要的 Linux 环境变量的格式

2.3 追加到配置文件中

使用:echo xxx >> file

echo export ${line%%:*}"="${line#*:} >> /etc/profile

2.4 健壮性处理

luelue.properties 配置文件中通常有 # 标识的注释,这些注释文字很明显不是我们所需要的

通过:$line != \#*判断是否是 # 开头

2.5 加载配置文件

最后别忘记 source /etc/profile 是配置文件剩下

字符串判空

Linux 字符串判空操作奇奇怪怪,多种多样,做这个功能的时候看花了眼

通常是使用,但是这种情况判断好使,!= 我测试是无效的。

if [ x"$prv" = x ]; then
    xxx
else
    xxx
fi

这里整理出一个简单好用的判断非空的方式

if [ -z $prv ]; then
    xxx
else
    xxx
fi

7 声望
3 粉丝
0 条评论
推荐阅读
Liquibase 数据库版本管理工具:3. changeSet 变更集详解
上篇文章中详细了介绍了一下changelog 文件的使用,本篇文章将详细说一下 changeSet 变更集 中的细节,以及通常的使用方式 1.变更集分类 changeSet 分为 6类: add create drop rename sql other 官方文档:[链接...

哒哒队长1阅读 4k评论 1

Docker学习:Image的本地存储结构
在使用Docker时候,针对镜像的操作一般就是docker pull,docker build,docker commit(刚开始接触Docker的时候,还不会Dockerfile,经常使用这个命令,但是经历了一次血的教训,已经放弃这个命令很久)这些操作...

backbp4阅读 9.7k评论 3

利用Docker部署管理LDAP及其初次使用
前言:本周主要写了gitlabWebhook转github的项目,总体上没有遇到什么大问题,这周接触到了LDAP,于是就花时间实际操作了解了一下。

李明5阅读 829

BI系统打包Docker镜像及部署的技术难度和实现
随着容器化技术盛行,Docker在前端领域也有着越来越广泛的应用;传统的前端部署方式需要我们将项目打包生成一系列的静态文件,然后上传到服务器,配置nginx文件;如果我们使用容器化部署,将部署操作都命令化,集...

葡萄城技术团队2阅读 8.3k

深入剖析容器网络和 iptables
Docker 能为我们提供很强大和灵活的网络能力,很大程度上要归功于与 iptables 的结合。在使用时,你可能没有太关注到 iptables 的作用,这是因为 Docker 已经帮我们自动完成了相关的配置。

张晋涛3阅读 1.2k

封面图
Kubernetes v1.26 新特性一览
我每期的 「k8s生态周报」都有一个叫上游进展的部分,所以很多值得关注的内容在之前的文章中已经发过了。这篇中我会再额外介绍一些之前未涵盖的,和之前介绍过的值得关注的内容。

张晋涛2阅读 573评论 1

封面图
Kubernetes 证书管理系列(一)
大家好,我是张晋涛。这是一个系列文章,将会通过七篇内容和大家一起聊聊 Kubernetes 中的证书管理。以下是内容概览:如上所示,在第一篇中,我们将从原理出发,来理解 Kubernetes 中的证书及其相关的作用,然后...

张晋涛2阅读 803

封面图
7 声望
3 粉丝
宣传栏