docker-compose使用env文件解析

docker-composeenv_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 文件中使用环境变量来配置服务。例如,你可以在 commandenvironmentimage 等指令中引用它们。

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.webexample.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 文件中的值。

相关推荐
丘山子1 小时前
一些鲜为人知的 IP 地址怪异写法
前端·后端·tcp/ip
诡异森林。1 小时前
Docker--Docker网络原理
网络·docker·容器
CopyLower1 小时前
在 Spring Boot 中实现 WebSockets
spring boot·后端·iphone
ALex_zry1 小时前
Docker Macvlan网络配置实战:解决“network already exists“错误
网络·docker·php
IT小辉同学1 小时前
Docker如何更换镜像源提高拉取速度
spring cloud·docker·eureka
.生产的驴2 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
景天科技苑2 小时前
【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
开发语言·后端·rust·match·enum·枚举与模式匹配·rust枚举与模式匹配
matrixlzp2 小时前
K8S Service 原理、案例
云原生·容器·kubernetes
追逐时光者3 小时前
MongoDB从入门到实战之Docker快速安装MongoDB
后端·mongodb
方圆想当图灵3 小时前
深入理解 AOP:使用 AspectJ 实现对 Maven 依赖中 Jar 包类的织入
后端·maven