【Docker】小记5 compose-环境变量
够格GOUGE 2024-08-12 16:37:01 阅读 60
compose-环境变量
记录一下环境变量的内容
文章目录
compose-环境变量前言一、直接写入变量值二、使用变量文件1.默认 .env 文件2.env_file指令3.CLI4.一点细节
总结
前言
compose yaml文件中环境变量可以有两种设置方法,1、直接在文件中写入变量值。2、用变量文件。
一、直接写入变量值
这个不用赘述吧,直接
<code># compose file
services:
web:
image: "webapp:v1.5"
v1.5 就是变量
二、使用变量文件
1.默认 .env 文件
前提: 将.env文件放置于compose文件同级目录下
# .env
TAG=v1.5
# compose file
services:
web:
image: "webapp:${TAG}"
意思就是docker compose会自动搜寻文件中的这个TAG变量然后给值替换上去,验证方法就是启动后执行
docker compose config
$ docker compose config
# print
services:
web:
image: 'webapp:v1.5'
2.env_file指令
在compose2.24.0之后,可以使用字段env_file在compose文件中配置环境变量
env_file:
- path: ./default.env
required: true # default
- path: ./override.env
required: false
如果你缺少目标env文件,但是参数required=true时会报异常,required=false时compose会忽略这个问题
也可以写为
services:
webapp:
image: “”
env_file:
- .env
- .env.override
compose会按照顺序加载这些文件,变量以最后定义的为准
同时,向下兼容,依然可以使用${env_key}的方式来进行变量获取,前提是你的文件中有这个env_key,这样的话不需要拘泥于env文件所在位置,因为我没试过换地方,我选择同级目录【狗头】
services:
webapp:
image: my-webapp-image
environment:
- DEBUG=${ DEBUG}
可以使用一个命令也就是 docker compose run -e DEBUG=0 来覆盖env文件的值
3.CLI
使用命令指定env文件
docker compose --env-file ./config/.env.dev up
大差不差
4.一点细节
关于如何使用 合成文件(compose yaml)里的环境变量属性和 env_file的说法
直接使用合成文件中的属性
属性值 较服务名称缩进4个字符
web:
environment:
- DEBUG=1
而且你可以不设置具体的值,只设置一个变量,然后再运行命令时设置
web:
environment:
- DEBUG
有很多写法,列举几个
${ var} # 设置变量为var的值
${ var:-default} # 如果已设置且非空就是var的值,否则为默认值
${ var-default} # 如果已设置且非空就是var的值,否则为默认值
${ var:?error} # 如果设置且非空,则返回VAR的值,否则退出并返回错误
${ var?error} # 如果设置且非空,则返回VAR的值,否则退出并返回错误
${ VAR:+replacement} # 如果设置了VAR且非空,则替换为replacement的值,否则为空
${ VAR+replacement} # 如果设置了VAR且非空,则替换为replacement的值,否则为空
想要更多,就在 https://docs.docker.com/compose/compose-file/12-interpolation/
使用 env_file中的属性
使用env_file属性,比直接使用.env文件的好处是不需要拘泥于file的使用目录
比如直接用命令:docker run --env-file=FILEPATH …(我这两个点是其他指令的意思)
web:
env_file:
- 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文件中也设置
db:
image: "postgres:${POSTGRES_VERSION}"
这种情况,如果没有在命令行设置POSTGRES_VERSION的值,那么会被替换为
db:
image: "postgres:."
环境变量文件小细节
VAR=VAL
-> VAL
VAR="VAL"code> ->
VAL
VAR='VAL'code> ->
VAL
VAR=VAL # comment
-> VAL
VAR=VAL# not a comment
-> VAL# not a comment
引号的内联注释必须跟在右引号之后。
VAR="VAL # not a comment"code> ->
VAL # not a comment
VAR="VAL" # commentcode> ->
VAL
按字面意思使用单引号(‘)值。
VAR='$OTHER'code> ->
$OTHER
VAR='${OTHER}'code> ->
${OTHER}
引号可以用\转义。
VAR='Let\'s go!'code> ->
Let's go!
VAR="{\"hello\": \"json\"}"code> ->
{"hello": "json"}
双引号的值支持常见的外壳转义序列,包括\n、\r、\t和\。
VAR="some\tvalue"code> ->
some value
VAR='some\tvalue'code> ->
some\tvalue
VAR=some\tvalue
-> some\tvalue
优先级
总结
这是是对compose的yaml集成文件中环境变量设置的记录,来源于官网说明,简单记录。最后,日常想念女朋友。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。