集成direnv 与docker-compose 进行环境变量管理

direnv 是一个不错的换将变量管理工具,同时日常的开发测试中我们使用docker-compose 会比较多,一般我们的玩法是
可以再docker-compose 中指定环境变量,可以通过environment 或者.env 文件,或者env_file ,为了学习使用direnv工具
集成了docker-compose

direnv 安装

参考 direnv 简单使用

docker-compose 环境准备

  • docker-compose 文件

    一个比较简单的nginx web site ,传递了一个USERTYPE 的环境变量

version: "3"
services:
   web: 
     image: nginx
     environment: 
     - "type=${USERTYPE}"
     ports: 
     - "8080:80"
  • .envrc 文件

    direnv 默认加载的文件

export FOO=foo
export USERNAME=dalong
export USERPASSWORD=demoapp
export USERTYPE=system

运行&&测试

  • 进入目录

    可以看到自动加载了配置

cd envconf 
direnv: loading .envrc                                                                                                                            
direnv: export +FOO +USERNAME +USERPASSWORD +USERTYPE
  • 运行
docker-compose up -d
  • 查看加载环境变量
docker-compose exec web sh
# env
HOSTNAME=c14a12f49eb1
type=system
HOME=/root
TERM=xterm
NGINX_VERSION=1.15.11-1~stretch
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NJS_VERSION=1.15.11.0.3.0-1~stretch
PWD=/
  • 禁用环境变量加载
direnv deny .
docker-compose up -d
WARNING: The USERTYPE variable is not set. Defaulting to a blank string.
Creating envconf_web_1 ... done

说明:通过deny 我们可以卸载加载的配置,很方便进行ci/cd 的构建

一种基于环境加载配置的方法

很简单,就是基于文件夹的区分,编写了不同的环境变量,基于direnv 的hook 自动加载

  • 项目结构
├── docker-compose.yaml
├── prod
│ └── .envrc
└── test
    └── .envrc
  • 说明
    prod 以及test 是不同环境的配置参数
  • 运行
for test
cd test
direnv allow
docker-compose -f ../docker-compose.yaml up -d
docker-compose -f ../docker-compose.yaml exec web sh
# env
HOSTNAME=9d9e88b765d3
type=user
HOME=/root
TERM=xterm
NGINX_VERSION=1.15.11-1~stretch
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NJS_VERSION=1.15.11.0.3.0-1~stretch
PWD=/

for prod
cd prod
建议还是执行下 direnv allow ,实际上是自动加载的 (direnv 的hook)
docker-compose -f ../docker-compose.yaml up -d
docker-compose -f ../docker-compose.yaml exec web sh
HOSTNAME=a371d04f6d5d
type=system
HOME=/root
TERM=xterm
NGINX_VERSION=1.15.11-1~stretch
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NJS_VERSION=1.15.11.0.3.0-1~stretch
PWD=/

说明

以上只是一种实践,基于动态环境变量的切换我们可以做好多比较灵活的功能开发,提高实际的效率

参考资料

https://github.com/rongfengliang/direnv-docker-compose-demo
https://docs.docker.com/compose/environment-variables/
https://direnv.net/

posted on   荣锋亮  阅读(490)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2018-04-18 phoenix elixir 框架简单试用
2016-04-18 Netflix Zuul 了解
2014-04-18 gridview 合并单元格 并原样导出数据
2014-04-18 转 oracle 学习- 用户权限角色

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示