Mun*_*erg 5 migration command-line-interface node.js docker knex.js
我正在使用 docker 和 knex 构建节点/快速服务进行数据库交互。我有一个env_file(在 docker-compose 文件中定义)定义了一些环境变量。该应用程序正在正确读取它们,因为 aconsole.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',
},
},
};
Run Code Online (Sandbox Code Playgroud)
如果我将这些值硬编码到 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
Run Code Online (Sandbox Code Playgroud)
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"]
Run Code Online (Sandbox Code Playgroud)
dotenv 从同一级别的文件中读取变量,因此如果您的 knexfile 与 .env 不在同一目录级别,您可能需要设置路径。像这样的东西:
import dotenv from 'dotenv'
dotenv.config({ path: '../../.env' })
Run Code Online (Sandbox Code Playgroud)
您可以阅读文档了解更多详细信息https://www.npmjs.com/package/dotenv
您没有在设置中正确设置环境变量。也许您引用的 env_file 错误,或者您的环境变量设置可能有拼写错误。
您需要提供更多信息,您的 docker compose 文件等如何。您的 knexfile.js 看起来正确。
编辑:
从您的 docker-compose 文件来看,您似乎仅将数据库连接详细信息传递到 API 容器。没有任何内容显示您如何运行 knex 迁移以及如何为该调用传递这些变量。
编辑2:
bash -c "sleep 10 && npm run knex migrate:latest"
Run Code Online (Sandbox Code Playgroud)
命令打开新的 shell,该 shell 没有设置连接详细信息的环境变量。您需要将带有连接详细信息的环境变量传递到 shell。
对您来说最简单的方法可能是编写 run-migrations.sh 脚本,该脚本在运行迁移之前正确设置和传递变量。喜欢:
for i in $(cat api.env); do
export $i;
done;
sleep 10;
npm run knex migrate:latest;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6838 次 |
| 最近记录: |