我正在使用 docker 和 knex 构建 Node/express 服务进行数据库交互。我有一个 env_file
(在 docker-compose 文件中定义),其中定义了一些环境变量。应用程序正在正确读取它们,因为 console.log(process.env.DATABASE_USER);
将记录正确的值。
我按照 knex 文档设置了一个 knex 文件,如下所示:
module.exports = {
development: {
client: 'pg',
connection: {
host: process.env.DATABASE_HOST,
port: process.env.DATABASE_PORT,
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME_DEV,
},
migrations: {
directory: __dirname + '/db/migrations',
},
seeds: {
directory: __dirname + '/db/seeds',
},
},
};
如果我将这些值硬编码到 knexfile 中,一切都很好。我可以连接到数据库、运行迁移等。
当我使用环境变量(如上)时,它们返回未定义。这是为什么?
更新:
我的 docker compose 文件 --api.env
只是一个基本的 .env 文件:
version: '3.3'
services:
db:
container_name: db
build:
context: ./services/api/src/db
dockerfile: Dockerfile
ports:
- 5435:5432
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
nginx:
container_name: nginx
build: ./services/nginx
restart: always
ports:
- 80:80
depends_on:
- api
links:
- api
api:
container_name: api
build:
context: ./services/api
dockerfile: Dockerfile
volumes:
- './services/api:/usr/src/app'
- './services/api/package.json:/usr/src/app/package.json'
ports:
- 8887:8888
env_file: ./api.env
depends_on:
- db
links:
- db
client:
container_name: client
build:
context: ./services/client
dockerfile: Dockerfile
volumes:
- './services/client:/usr/src/app'
ports:
- 3007:3000
environment:
- NODE_ENV=development
depends_on:
- api
links:
- api
API 服务的 Dockerfile:
FROM node:latest
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
ENV PATH /usr/src/app/node_modules/.bin:$PATH
ADD package.json /usr/src/app/package.json
RUN npm install
CMD ["npm", "start"]
最佳答案
dotenv 从同一级别的文件中读取变量,因此如果您的 knexfile 与 .env 不在同一目录级别,您可能需要设置路径。像这样的事情:
import dotenv from 'dotenv'
dotenv.config({ path: '../../.env' })
您可以阅读文档了解更多详细信息 https://www.npmjs.com/package/dotenv
关于node.js - Knexfile不读取环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49905967/