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

相关推荐
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
杜杜的man5 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang
java小吕布5 小时前
Java中Properties的使用详解
java·开发语言·后端
南猿北者6 小时前
docker Network(网络)
网络·docker·容器
2401_857610036 小时前
Spring Boot框架:电商系统的技术优势
java·spring boot·后端
sam-1237 小时前
k8s上部署redis高可用集群
redis·docker·k8s
Fanstay9858 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
杨哥带你写代码8 小时前
网上商城系统:Spring Boot框架的实现
java·spring boot·后端
camellias_8 小时前
SpringBoot(二十一)SpringBoot自定义CURL请求类
java·spring boot·后端