Knexfile 不读取环境变量?

Knexfile not reading environment variables?

我正在构建一个 node/express 服务,使用 docker 和 knex 进行数据库交互。我有一个 env_file(在 docker-compose 文件中定义),其中定义了一些环境变量。该应用程序正在正确读取它们,因为 console.log(process.env.DATABASE_USER); 将记录正确的值。

我按照 knex 文档设置了一个如下所示的 knexfile:

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 中,一切都很好。我可以连接到数据库,运行 迁移等

当我使用我的环境变量(如上)时,它们 return 未定义。这是为什么?

更新:

我的 docker 撰写文件--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"]

您没有在设置中正确设置环境变量。也许您指的是 env_file 错误,或者您的环境变量设置中可能有错字。

您需要提供更多信息,您的 docker 撰写文件如何等等。您的 knexfile.js 看起来是正确的。

编辑:

从您的 docker-compose 文件来看,您似乎只将数据库连接详细信息传递给 API 容器。没有显示您如何 运行ning knex 迁移以及您如何为该调用传递这些变量。

编辑 2:

bash -c "sleep 10 && npm run knex migrate:latest"

命令打开新的 shell,它没有设置连接详细信息的环境变量。您需要将带有连接详细信息的环境变量传递给您的 shell.

对您来说最简单的方法可能是编写 运行-migrations.sh 脚本,该脚本在 运行 迁移之前正确设置和传递变量。喜欢:

for i in $(cat api.env); do
   export $i;
done;
sleep 10;
npm run knex migrate:latest;

dotenv 从文件中读取 vars 与它在同一级别,因此如果您的 knexfile 与您的 .env 不在同一目录级别,您可能需要设置路径。像这样:

import dotenv from 'dotenv'
dotenv.config({ path: '../../.env' })

您可以阅读文档了解更多详情https://www.npmjs.com/package/dotenv