【问题标题】:running knex migrations on elastic beanstalk在弹性豆茎上运行 knex 迁移
【发布时间】:2015-11-11 23:06:34
【问题描述】:

我只是将我的 node.js 项目放在 elastic beanstalk 上,并且配置正确。

我现在已通过 knex 插件将应用程序连接到我的 RDS postgres 数据库。

在本地,要运行 knex 迁移以更新本地数据库,我只需在控制台“knex migrate:latest”中运行它,但这不适用于弹性 beanstalk,因为我无法从项目文件夹中运行命令(至少我认为我不能)。

如何在我的弹性 beanstalk 应用程序上运行 knex 命令?

请记住,我对弹性豆茎很敏感。

【问题讨论】:

    标签: node.js amazon-web-services amazon-elastic-beanstalk knex.js


    【解决方案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吗?据说已经弃用了,所以不知道如何处理已经存在的表。
        • 我猜不适合多实例设置
        猜你喜欢
        • 2015-03-12
        • 2020-01-21
        • 2023-03-19
        • 2023-04-07
        • 2016-01-13
        • 2015-04-02
        • 2013-05-25
        • 2015-03-20
        • 1970-01-01
        相关资源
        最近更新 更多