在 Docker-Compose 中使用变量简介使用环境选项使用 .env 文件使用 env-file 选项结论

2025-06-10

在 Docker-Compose 中使用变量

介绍

使用环境选项

使用 .env 文件

使用 env-file 选项

结论

介绍

我们迟早都要在 Compose 文件中处理环境变量。它们可能会很麻烦,尤其是在我们不知道如何正确使用它们的情况下。这篇文章回顾了我所学到的所有关于环境变量的知识,旨在使这些变量的使用更加简单,而且最重要的是,更加安全。 

首先我们如何使用环境变量?

Docker Compose 允许我们通过命令行传递环境变量,或者在 shell 中定义它们。但是,建议将这些值保留在实际的 Compose 文件中,而不是在命令行中。

你可能会问,为什么? 

因为这样,我们不必每次部署容器时都记住所有使用的环境变量。通过将它们存储在 Compose 文件中,我们能够在构建过程中保持一致性。 

有几种方法可以做到这一点:

使用环境选项

使用 Compose 环境选项允许我们在 Compose 文件中声明环境变量及其值,如下所示:

version: '3.1'
services:
db:
container_name: Mongo-db
image: mongo:latest
restart: always
volumes:
- ./myData:/data/db
environment:
- MONGO_INITDB_DATABASE=MyDatabase
- MONGODB_USER=Nya
- MONGODB_PASS=secretpassword
ports:
- 27020:27017
version: '3.1'
services:
db:
container_name: Mongo-db
image: mongo:latest
restart: always
volumes:
- ./myData:/data/db
environment:
- MONGO_INITDB_DATABASE=MyDatabase
- MONGODB_USER=Nya
- MONGODB_PASS=secretpassword
ports:
- 27020:27017

这是在 Compose 文件中存储环境变量最简单、最快捷的方法。然而,在我看来,它有一个很大的缺点:与安全有关。你能猜出是什么吗?

这是正确的。 

将环境变量的值存储在 Compose 文件中,十有八九会直接进入源代码管理,这是一个巨大的安全风险。幸运的是,我们还有一个替代方案:使用外部文件来存储环境变量。

使用 .env 文件

使用外部文件作为环境变量的主要优势在于,你可以将该文件保留在源代码管理之外。毕竟,没人喜欢自己的密码/API 密钥/其他超级机密信息被公开到互联网上,任人随意查看 :p 

.env文件是纯文本文件。您无需为其命名,扩展名即为文件的实际名称。它们必须创建在项目的根目录下, docker-compose.yml文件也应位于此目录下。 

我们在.env文件中声明并分配变量 。您可以随意命名变量,因为我们只会访问它们的值。这是我的 .env文件:

.env 文件内容

您还可以 使用 linux cat 命令从命令行创建和填充.env文件:

从命令行创建 .env 文件

提示:请记住不要在“=”符号和分配给变量的值之间留下任何空格,因为它们将被添加到字符串中。

现在,我们已经将变量存储在 .env文件中,接下来让我们在 Compose 文件中使用它们。现在是时候使用字符串插值(这是使用这种表示法的别称:${string})将.env变量的 赋给Compose 文件中的环境变量了,如下所示:

version: '3.1'
services:
db:
container_name: Mongo-db
image: mongo:latest
restart: always
volumes:
- ./myData:/data/db
environment:
- MONGO_INITDB_DATABASE=${DATABASE}
- MONGODB_USER=${USERNAME}
- MONGODB_PASS=${PASS}
ports:
- 27020:27017
version: '3.1'
services:
db:
container_name: Mongo-db
image: mongo:latest
restart: always
volumes:
- ./myData:/data/db
environment:
- MONGO_INITDB_DATABASE=${DATABASE}
- MONGODB_USER=${USERNAME}
- MONGODB_PASS=${PASS}
ports:
- 27020:27017

如您所见,我们维护环境选项,并简单地将我们的外部值分配给 Compose 环境变量。

要检查一切是否正常运行,请运行以下命令:

docker-compose up
Enter fullscreen mode Exit fullscreen mode

提示:您可以通过运行以下命令(在不同的终端中)来检查分配给环境变量的值:

docker-compose config
Enter fullscreen mode Exit fullscreen mode

环境变量优先级

我们必须牢记的一点是,Compose 使用优先级来选择要使用的环境值。这是什么意思? 

如果我们在多个文件中声明相同的环境变量(例如,在 Compose 文件和外部 .env文件中),并且使用不同的值,Compose 将使用 Compose 文件中声明的变量的值。为什么?

因为根据变量的声明位置,Compose 会赋予其更高或更低的优先级。优先级从高到低的顺序如下:

1. Compose 文件
2. Shell 环境变量
3. 环境文件
4. Dockerfile
5. 变量未定义

如果由于某种原因,Compose 获取并分配了您未预期的值,则可能就是这个原因造成的。请确保所有变量都声明在您想要的位置。 

使用 env-file 选项

在上一节中,我们讨论了 .env文件,并提到这些文件没有命名。但是,如果出于某种原因,我们确实希望 .env文件有一个名称,例如secret-stuff.env,Compose 有一个漂亮的小选项,名为env-file

此选项允许我们告诉 Compose 需要查找哪个 .env文件,而不是默认行为,默认行为是查找未命名的 .env文件。env -file选项的使用方法如下

version: '3.1'
services:
db:
container_name: Mongo-db
image: mongo:latest
restart: always
volumes:
- ./myData:/data/db
env_file:
- ./secret-stuff.env
ports:
- 27020:27017
version: '3.1'
services:
db:
container_name: Mongo-db
image: mongo:latest
restart: always
volumes:
- ./myData:/data/db
env_file:
- ./secret-stuff.env
ports:
- 27020:27017

如你所见,我们添加了 env_file 选项,它指向一个名为secret-stuff.env的文件。剩下的就是将之前的 .env文件重命名为secret-stuff.env  。

你可能已经注意到,我们的 Compose 文件中不再存在 environment 选项。这是因为使用env-file选项会引发一个问题(这让我很头疼)。请允许我解释一下:

要将外部命名 .env文件中声明的值赋给 Compose 变量,需要该文件在主 Compose 服务中定义。这与 Compose 执行操作时遵循的顺序有关。但是,我们没有主服务,因为我们只使用了一个db 服务。因此,如果我们尝试部署 Compose 文件,它会提示我们的变量未定义,并用空字符串替换它们。

评论:不必相信我的话,赶紧试试吧!运行 docker-compose up 看看会发生什么 :)

那么,我们该如何解决这个问题呢?以下是我的发现:

如果我们从 Compose 文件中删除 environment 选项,那么在部署时,Compose 将会搜索指定的secret-stuff.env 文件,而当存在 environment 选项时,它不会执行此操作。问题解决了!

但请记住,由于我们不再有环境选项,我们必须直接在secret-stuff.env文件中声明环境变量,如下所示:

替代文本

再次检查一切是否正常,运行:

docker-compose up
Enter fullscreen mode Exit fullscreen mode

结论

好了,各位!现在,您(希望如此!)已经了解了在 Compose 文件中安全处理环境变量的不同方法。如果您有任何疑问或想讨论任何事情,请随时联系我。这是我的Twitter 页面链接。
 
感谢您的阅读 :)

鏂囩珷鏉ユ簮锛�https://dev.to/nyagarcia/using-variables-in-docker-compose-11mf
PREV
Git 中的撤消:如何修复常见错误
NEXT
解决复杂编码问题的 7 个强大原则 😤 长评论 🥴