如何在 Node.js 和 Docker 中使用 dotenv 管理密钥和配置
这是什么dotenv?
我为什么要使用dotenv?
如何dotenv在我的项目中进行设置?
使用dotenv-safe
在 Docker 中使用
这是什么dotenv?
这是一个 JavaScript 包,它可以KEY=VALUE从.env文件中读取数据(示例如下),并将每一对数据设置为环境变量。
// 1. Create a .env file:
DB_ADMIN_USERNAME=techbos
DB_ADMIN_PASSWORD=Pa$$w0rd
// 2. In your node app, load dotenv to read .env and set env variables when app starts
require('dotenv').config();
// 3. You can now use the env variables in your app
connectDatabase({
username: process.env.DB_ADMIN_USERNAME, //techbos
password: process.env.DB_ADMIN_PASSWORD, // Pa$$w0rd
});
我为什么要使用dotenv?
dotenv它允许您将密钥与源代码分离。这在协作环境(例如工作或开源项目)中非常有用,因为您可能不想与他人共享数据库登录凭据。您可以共享源代码,同时允许其他人创建自己的.env文件。
它还可用于动态配置应用程序,而无需更改源代码。例如,您可以DB_URL为本地开发设置开发数据库。或者,如果您想在本地开发时将日志打印到控制台,但在生产环境中不打印,您可以这样做:
// .env file
ENV=dev
// in your app
if (process.env.ENV === 'dev') console.log(...);
对于部署到数百甚至数千个实例的实际应用程序,使用dotenv(或使用其他类似技术)可以让所有实例共享相同的源代码,同时每个实例都有不同的.env文件,以便它们可以使用不同的配置,例如连接到不同的数据库或将日志写入不同的端点。
如何dotenv在我的项目中进行设置?
1. dotenvNode.js 中的预加载
启动你的 Node 应用时,它会dotenv预加载 dotenv,这样你甚至不需要在源代码中引入 dotenv。
// use this
node -r dotenv/config index.js
// instead of
require('dotenv').config();
2. 添加.env到.gitignore
永远不要.env在源代码控制系统中共享文件。相反,应该创建一个单独的私有仓库来存储你自己的.env文件,同时与他人共享其余的源代码。
//.gitignore
.env
3..env想创建多少个就创建多少个
通常会有多个.env文件。例如,一个用于开发环境,一个用于测试环境,一个用于生产环境。检出源代码后,复制.env适用于您环境的文件,然后启动应用程序。
3. 启动你的应用
// E.g., use with babel-node for local development
nodemon --exec babel-node -r node_modules/dotenv/config src/index.js
// E.g., run with node in production
node -r dotenv/config src/index.js
4. 在 Docker 中运行
// Dockerfile
CMD node -r dotenv/config ./build/index.js
使用dotenv-safe
一个很好的替代方案dotenv是dotenv-safe,它与基本相同,dotenv区别在于它允许你创建.env.example文件。这有两个目的:
- 它允许你在示例文件中指定所有必需的环境变量。运行时,该软件包会检查
.env文件是否定义了所有必需的变量,如果没有,则会抛出异常。 - 您可以
.env.example与他人共享该文件,以便每个人都知道需要哪些环境变量。
在 Docker 中使用
在某些情况下,将.env文件构建到 Docker 镜像中被认为是一种不好的做法,因为如果镜像与他人共享,则密钥可能会泄露。
为了解决这个问题,你可以.env在运行时将文件映射到 Docker 容器中:
volumes:
- /local/file/path/to/.env:/app/.env
另一种方法是使用env_fileDocker 选项。您可以在这里阅读更多信息。