在弹性豆茎上运行 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 文件中运行 prestartpoststart 脚本。


    "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 迁移的主要内容,如果未能解决你的问题,请参考以下文章

在弹性豆茎上运行 celery-worker

如何让 phantomjs 安装在弹性豆茎上?

弹性豆茎上的 wurfl

在弹性豆茎上设置 https 代理

无法在弹性豆茎上加载带有瓶子的静态文件

如何在弹性豆茎上强制 https?