【Docker】小记5 compose-环境变量

打印 上一主题 下一主题

主题 844|帖子 844|积分 2532

compose-环境变量

记录一下环境变量的内容


  

媒介

compose yaml文件中环境变量可以有两种设置方法,1、直接在文件中写入变量值。2、用变量文件。

一、直接写入变量值

这个不消赘述吧,直接
  1. # compose file
  2. services:
  3.   web:
  4.     image: "webapp:v1.5"
复制代码
v1.5 就是变量
二、利用变量文件

1.默认 .env 文件

条件: 将.env文件放置于compose文件同级目录下
  1. # .env
  2. TAG=v1.5
  3. # compose file
  4. services:
  5.   web:
  6.     image: "webapp:${TAG}"
复制代码
  1. 意思就是docker compose会自动搜寻文件中的这个TAG变量然后给值替换上去,验证方法就是启动后执行
  2. docker compose config
复制代码
  1. $ docker compose config
  2. # print
  3. services:
  4.   web:
  5.     image: 'webapp:v1.5'
复制代码
2.env_file指令

在compose2.24.0之后,可以利用字段env_file在compose文件中配置环境变量
  1. env_file:
  2.   - path: ./default.env
  3.     required: true # default
  4.   - path: ./override.env
  5.     required: false
复制代码
如果你缺少目标env文件,但是参数required=true时会报异常,required=false时compose会忽略这个问题
也可以写为
  1. services:
  2.   webapp:
  3.     image: “”
  4.     env_file:
  5.       - .env
  6.       - .env.override
复制代码
compose会按照顺序加载这些文件,变量以末了定义的为准
同时,向下兼容,依然可以利用${env_key}的方式来举行变量获取,条件是你的文件中有这个env_key,这样的话不必要拘泥于env文件所在位置,因为我没试过换地方,我选择同级目录【狗头】
  1.   services:
  2.     webapp:
  3.       image: my-webapp-image
  4.       environment:
  5.         - DEBUG=${DEBUG}
复制代码
可以利用一个下令也就是 docker compose run -e DEBUG=0 来覆盖env文件的值
3.CLI

利用下令指定env文件
  1. docker compose --env-file ./config/.env.dev up
复制代码
大差不差
4.一点细节

关于怎样利用 合成文件(compose yaml)里的环境变量属性和 env_file的说法
直接利用合成文件中的属性
属性值 较服务名称缩进4个字符
  1. web:
  2.   environment:
  3.     - DEBUG=1
复制代码
而且你可以不设置具体的值,只设置一个变量,然后再运行下令时设置
  1. web:
  2.   environment:
  3.     - DEBUG
复制代码
有许多写法,枚举几个
  1. ${var}  # 设置变量为var的值
  2. ${var:-default} # 如果已设置且非空就是var的值,否则为默认值
  3. ${var-default} # 如果已设置且非空就是var的值,否则为默认值
  4. ${var:?error} # 如果设置且非空,则返回VAR的值,否则退出并返回错误
  5. ${var?error} # 如果设置且非空,则返回VAR的值,否则退出并返回错误
  6. ${VAR:+replacement} # 如果设置了VAR且非空,则替换为replacement的值,否则为空
  7. ${VAR+replacement} # 如果设置了VAR且非空,则替换为replacement的值,否则为空
  8. 想要更多,就在 https://docs.docker.com/compose/compose-file/12-interpolation/
复制代码
利用 env_file中的属性
利用env_file属性,比直接利用.env文件的好处是不必要拘泥于file的利用目录
好比直接用下令:docker run --env-file=FILEPATH …(我这两个点是其他指令的意思)
  1. web:
  2.   env_file:
  3.     - web-variables.env
复制代码

有几个点,是官方文档说的
1、多个文件,会按照顺序从上到下执行,会覆盖同名环境变量
2、.env可以和env_file同时利用,但是在.env中定义的变量不能在合成文件(yaml文件中再次声明利用)
3、优先级为 environment > env_file
4、env_file的文件地点与yaml文件事相对的
5、可以用 docker compose run -e 来覆盖.env文件里的值
6、利用env_file而且指定了文件地点,但是确实文件的话,会报错。如果设置了参数 required=False,会跳过这个问题

可以在下令中设置 POSTGRES_VERSION=9.3 然后再yaml文件中也设置
  1. db:
  2.   image: "postgres:${POSTGRES_VERSION}"
复制代码
这种情况,如果没有在下令行设置POSTGRES_VERSION的值,那么会被更换为
  1. db:
  2.   image: "postgres:."
复制代码
环境变量文件小细节


  • VAR=VAL -> VAL
  • VAR="VAL" -> VAL
  • VAR='VAL' -> VAL

  • VAR=VAL # comment -> VAL
  • VAR=VAL# not a comment -> VAL# not a comment
  • 引号的内联表明必须跟在右引号之后。
  • VAR="VAL # not a comment" -> VAL # not a comment
  • VAR="VAL" # comment -> VAL
  • 按字面意思利用单引号(‘)值。
  • VAR='$OTHER' -> $OTHER
  • VAR='${OTHER}' -> ${OTHER}
  • 引号可以用\转义。
  • VAR='Let\'s go!' -> Let's go!
  • VAR="{\"hello\": \"json\"}" -> {"hello": "json"}
  • 双引号的值支持常见的外壳转义序列,包括\n、\r、\t和\。
  • VAR="some\tvalue" -> some value
  • VAR='some\tvalue' -> some\tvalue
  • VAR=some\tvalue -> some\tvalue

优先级

总结

这是是对compose的yaml集成文件中环境变量设置的记录,来源于官网说明,简单记录。末了,日常惦记女朋侪。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表