[英]how to db:migrate after restoring database from mysql dump in docker
I have two docker containers for mysql
and ruby
and the ruby
container is dependent on mysql
container.
在我的docker-compose
中,我已將 sql 轉儲卷安裝到mysql
容器的/docker-entrypoint-initdb.d
中,以便在啟動某些數據容器時執行它並首次填充數據容器。
sql 轉儲被執行,數據按預期恢復到 db 容器,但問題是,在啟動ruby
(with rails) 容器時,它拋出了一個migration pending error
。 我知道發生這種情況是因為schema_migrations
表中沒有記錄任何模式遷移版本,因為數據是故意從 sql 轉儲中恢復的。
但是,即使運行docker-compose run <container> rake db:migrate
也無濟於事,因為它會拋出table already exists
錯誤,因為表已經創建。
如何將 Rails 架構遷移版本與數據庫中的實際數據同步?
我還嘗試通過手動將最新的架構版本號添加到schema_migrations
表中,但仍然返回migration pending error
。 而且,在從 sql 轉儲恢復之前,我無法運行docker-compose run <container> rake db:create db:migrate
因為容器的/docker-entrypoint-initdb.d
中的文件只有在尚未創建數據庫時才會執行。
我認為您可以將schema_migrations
中的所有數據連同初始轉儲模式一起轉儲,這樣它將包含遷移版本,並且在運行rails db:migrate
時不會引發異常。
更新:舊版本的 rails 實際上會檢查所有模式版本以決定是否需要遷移。 你可以在這里查看更多信息。
def needs_migration?(connection = Base.connection)
(migrations(migrations_paths).collect(&:version) - get_all_versions(connection)).size > 0
end
希望這會有所幫助。
您可以在 docker_entrypoint 文件中編寫bundle exec rake db:migrate
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.