在弹性豆茎上运行 knex 迁移
Posted
技术标签:
【中文标题】在弹性豆茎上运行 knex 迁移【英文标题】:running knex migrations on elastic beanstalk 【发布时间】:2015-11-11 23:06:34 【问题描述】:我只是将我的 node.js 项目放在 elastic beanstalk 上,并且配置正确。
我现在已通过 knex 插件将应用程序连接到我的 RDS postgres 数据库。
在本地,要运行 knex 迁移以更新本地数据库,我只需在控制台“knex migrate:latest”中运行它,但这不适用于弹性 beanstalk,因为我无法从项目文件夹中运行命令(至少我认为我不能)。
如何在我的弹性 beanstalk 应用程序上运行 knex 命令?
请记住,我对弹性豆茎很敏感。
【问题讨论】:
【参考方案1】:如果您使用的 npm 版本高于 5.2
。它通常带有一个npx
包,使您能够从本地项目node modules
而不是全局安装的项目中运行脚本/库。这使得直接从您的项目目录运行knex
变得容易。无需在预安装脚本中全局安装 knex 包。您可以像这样简单地拥有一个节点命令脚本:
"scripts":
"start": "npx knex migrate:latest && node server.js"
【讨论】:
【参考方案2】:在搜索过时的 SO 答案数小时后,这是我的工作设置:
.ebextensions/01-migrate-db.config
container_commands:
01_node_binary:
command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/node /bin/node"
leader_only: true
02_npm_binary:
command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/npm /bin/npm"
leader_only: true
03_migrate_db:
command: "sudo DB_HOST=$DB_HOST DB_PORT=$DB_PORT DB_NAME=$DB_NAME DB_USER=$DB_USER DB_PASSWORD=$DB_PASSWORD npm run db:migration:run"
leader_only: true
package.json
...
scripts:
"db:migration:run": "knex migrate:latest"
【讨论】:
【参考方案3】:Elastic Beanstalk 将在您的 package.json 文件中运行 prestart
和 poststart
脚本。
"name": "...",
"version": "1.0.0",
"description": "...",
"scripts":
"prestart": "node ./node_modules/knex/lib/bin/cli.js migrate:latest",
"poststart": "..."
或者您可以在启动服务器之前在代码中运行迁移:
knex.migrate.latest([config])
【讨论】:
小改动...... bin 文件夹不在 lib 目录中(至少在我的 knex 0.15.2 版本中)。"prestart": "node ./node_modules/knex/bin/cli.js migrate:latest",
也可以在没有节点 node_modules 的情况下运行knex migrate:latest
。但是prestart
是正确的地方吗?如果存在表冲突,服务器将无法启动。你们在用createTableIfNotExists
吗?据说已经弃用了,所以不知道如何处理已经存在的表。
我猜不适合多实例设置以上是关于在弹性豆茎上运行 knex 迁移的主要内容,如果未能解决你的问题,请参考以下文章