使用工头,我们可以 运行 一旦数据库启动就进行数据库迁移吗?

Using foreman, can we run db migration once the database is started?

我想 运行 foreman 中的数据库和迁移。但是,我发现他们通常在我开始foreman时同时运行。由于我运行迁移的时候数据库还没有完全启动,所以导致迁移失败。

Heroku 使用 Procfile 可以促进发布阶段。在所有命令 运行 之后,阶段将是 运行。我可以在我的电脑上使用工头做同样的事情吗?

Heroku 不依赖 Procfile 来维护发布过程。 Heroku 构建堆栈可以。

由于foreman为我们提供了同时运行多个进程的方式,而不是运行按顺序排列进程,所以您的问题不是foreman

不过,您还有其他方法可以做到这一点。

  1. 简单:因为foreman可以用shell命令启动你的进程,你可以使用基本的shell命令sleep(以秒为单位)延迟你的过程

    db_process: start_db_script.sh
    migrarion_process: sleep 5; bundle exec rake db:migrate --trace
    
  2. 完全控制:代替 运行 默认迁移 rake 任务,您可以编写另一个 rake 任务,在执行迁移之前检查与数据库的连接(参考

    retried = 0
    begin
      # Establishes connection
      ActiveRecord::Base.establish_connection
      # Try to reconnect
      # It will raise error if cannot reach your database
      ActiveRecord::Base.connection.reconnect! 
      Rake::Task["db:migrate"].invoke if ActiveRecord::Base.connected?
    rescue => e 
      retried += 1
      if retried <= 5 # Retry only 5 times
        sleep 1       # Wait 1 seconds before retry
        retry
      end
      puts "#{e} Cannot connect to your database with 5 seconds"
    end