【问题标题】:Knexfile not reading environment variables?Knexfile 不读取环境变量?
【发布时间】:2018-04-18 17:47:28
【问题描述】:

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

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

更新:

我的 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"]

【问题讨论】:

  • 您如何运行 knex 迁移?它没有显示在 docker compose 中。

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


【解决方案1】:

您没有在设置中正确设置环境变量。也许您引用的 env_file 错误,或者您的环境变量设置中可能存在拼写错误。

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

编辑:

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

EDIT2:

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

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

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

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

【讨论】:

  • 环境变量在应用程序的其他任何地方都有效,只是在 knexfile 中无效。但我会更新我的帖子以反映 docker 文件
  • 也许您没有在容器内调用 knex 迁移?
  • 另外,API Dockerfile 在这里会有所帮助。
  • @coockoo 也添加了 Dockerfile
  • @Jake 您在运行该 bash -c 时正在创建新的 shell,并且该 shell 没有设置这些环境变量。当然,它适用于硬编码值,因为在这种情况下,可以从 knexfile.js 中找到连接详细信息,而无需从 env 中获取它们。我会更新答案
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-08-13
    • 2019-02-25
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多