node.js - Knexfile不读取环境变量?

标签 node.js docker migration command-line-interface knex.js

我正在使用 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/

相关文章:

node.js - Elastic Map Reduce Node.js Bootstrap 不起作用

javascript - Express,如何将变量从路由传递到客户端的JS文件

docker - k8s集群中的两个coredns Pods处于pending状态

bash - docker中的chain sleep命令是如何组成的?

java - 问 :How to migrate Project from RapidClipse4 to RapidClipseX?

ruby-on-rails - 如何使用 STI 向派生类添加列?

asp.net - ASP.Net 框架 1.x 和 3.5/网站和 Web 应用程序之间的差异。迁移期间要考虑的事项

node.js - (Discord.js) 如何标记机器人本身

node.js - Koa.js : ctx. setcookie() 无法设置 cookie

shell - 错误 : unexpected end of file (expecting "do") for shell script in Dockerfile