【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集成文件中环境变量设置的记录,来源于官网说明,简单记录。最后,日常想念女朋友。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。