docker-compose
的 env_file
关键字允许你指定一个或多个包含环境变量的文件。
这些环境变量随后可以在 docker-compose.yml
文件中通过 ${VARIABLE}
的形式引用,或者在容器内部作为环境变量直接使用。
这对于保持配置的安全性和灵活性非常有用,尤其是当你需要避免在 docker-compose.yml
文件中硬编码敏感信息(如数据库密码)时。
如何使用 env_file
1. 创建环境变量文件:
首先,你需要创建一个或多个包含环境变量的文件。这些文件通常是纯文本文件,每行包含一个环境变量,格式为 KEY=value
。 例如,创建一个名为 .env
的文件,内容如下:
ini
DB_HOST=localhost
DB_USER=myuser
DB_PASS=mypassword
2. 在 docker-compose.yml
中引用环境变量文件
然后,在 docker-compose.yml
文件中,你可以通过 env_file
关键字指定一个或多个环境变量文件。这可以在全局级别(影响所有服务)或特定服务级别上完成。
a. 全局级别:
yaml
version: '3'
env_file:
- .env
services:
web:
image: myapp
environment:
- DB_NAME=myappdb
在这个例子中,.env
文件中的环境变量对所有服务都是可用的。
b. 服务级别:
yaml
version: '3'
services:
web:
image: myapp
env_file:
- .env.web
environment:
- DB_NAME=myappdb
在这个例子中,.env.web
文件中的环境变量仅对 web
服务是可用的。
其中
.env.web
文件中的环境变量仅对 web
服务可用,是因为 env_file
关键字被明确放置在了 web
服务的配置层级中,而不是因为文件名中的 .web
后缀。
使用 env_file 中的变量
在 docker-compose.yml
中使用环境变量
你可以在 docker-compose.yml
文件中使用环境变量来配置服务。例如,你可以在 command
、environment
、image
等指令中引用它们。
ini
version: '3'
services:
web:
image: myapp:${APP_VERSION}
environment:
- DB_HOST=${DB_HOST}
- DB_USER=${DB_USER}
- DB_PASS=${DB_PASS}
- DB_NAME=myappdb
注意:当 environment
指令和 env_file
同时使用时,environment
指令中指定的环境变量会覆盖 env_file
中同名的环境变量。
在 env 文件覆盖的容器内使用环境变量
bash
#在容器shell中直接打印就能显示
~ echo $DB_HOST
localhost
go
package main
#程序内使用
func main() {
// 读取环境变量
mysqlURL := os.Getenv("DB_HOST")
}
注意事项
- 默认情况下,
docker-compose
会查找与docker-compose.yml
文件位于同一目录下的.env
文件(如果它存在的话),并自动加载该文件中的环境变量。这意味着其实你不需要显式地在docker-compose.yml
文件中使用env_file
关键字来引用它(除非你还需要指定其他文件)。 - 当使用环境变量时,请确保不要将敏感信息(如密码)硬编码在
docker-compose.yml
文件中或版本控制的仓库中。相反,应该使用环境变量文件,并确保这些文件不会被意外泄露。
---
docker-compose是否会自动加载.env文件?.env.web 或 example.env 之类的会被自动加载吗
Docker Compose 默认会自动加载项目根目录下的 .env
文件 ,并将其中定义的环境变量应用到服务配置中。然而,对于 .env.web
或 example.env
之类的文件,Docker Compose 并不会自动加载它们,除非在 docker-compose.yml
文件中显式指定了这些文件。
---
docker-compose中关键字env_file 关键字指定的文件内容需要满足什么要求,kv值用冒号隔开行吗?或者等号?
在 docker-compose.yml
文件中,env_file
关键字用于指定一个或多个包含环境变量的文件。这些文件的内容应该遵循一定的格式要求,以便 Docker Compose 能够正确地解析并应用这些环境变量。
文件内容要求
- 格式:环境变量文件通常是以简单的键值对形式存在的,每行一个键值对,用于定义环境变量的名称和值。
- 分隔符 :键值对之间应该使用等号 (
=
) 来分隔,而不是冒号 (:
)。尽管在某些上下文中(如 shell 脚本或某些配置文件),冒号也可能用作分隔符,但在环境变量文件中,等号是标准且被广泛接受的分隔符。 - 注释 :环境变量文件通常不支持注释(尽管这取决于具体的解析器,但大多数情况下,注释行(以
#
开头的行)会被忽略)。 - 空行和空格 :环境变量文件中可以包含空行,这些行将被忽略。键值对中的键和值周围可以包含空格,但这些空格通常会被包含在变量值中,除非在解析时进行了额外的处理(例如,通过 shell 的
export
命令或在 Docker Compose 中通过某些方式处理)。
示例
一个典型的环境变量文件 .env.web
可能看起来像这样:
ini
# 这是一个注释,将被忽略
DB_HOST=localhost
DB_USER=root
DB_PASS=secret
# 注意:这里的 DB_PORT 周围有空格,这些空格将成为变量值的一部分
DB_PORT = 3306
然而,为了避免潜在的问题,建议始终在键和值之间以及等号两侧使用最少的空格(或根本不使用空格):
ini
DB_HOST=localhost
DB_USER=root
DB_PASS=secret
DB_PORT=3306
在 docker-compose.yml
中使用 env_file
在 docker-compose.yml
文件中,你可以这样使用 env_file
关键字来指定环境变量文件:
yaml
version: '3'
services:
web:
image: my-web-app
env_file:
- .env
- .env.web
在这个例子中,web
服务将加载 .env
和 .env.web
文件中定义的环境变量。如果两个文件中都定义了相同的变量,.env.web
文件中的值将覆盖 .env
文件中的值。