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
我正在构建一个 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