我有一个脚本文件,其中包含docker-compose命令
bootstrap.sh
set -e
#Building docker image
docker-compose build
#Creating Database
docker-compose run --rm app bundle exec rails db:create
#Running Migration
docker-compose run --rm app bundle exec rails db:migrate
#Seeding Database. Running this command twice will throw an error and will terminate the execution
docker-compose run --rm app bundle exec rails db:seed
#Starting Docker containers
docker-compose up
此处bundle exec rails db:seed
命令在每个数据库中仅应运行一次。当我第一次运行sh bootstrap.sh
时,它可以很好地工作,但随后的sh bootstrap.sh
运行将失败,因为我试图对同一数据库进行两次播种。
因此,即使播种失败,我也需要一种返回成功的方法,以便使我的docker容器正常运行。
例如 docker-compose run --rm app bundle exec rails db:seed || true
像这样。传递给docker-compose的命令失败时是否可以返回true?
答案 0 :(得分:1)
Rails还附带了一个方便的命令,该命令可以创建,加载模式并为您的数据库添加种子:db:setup
。
bin / rails db:setup命令将创建数据库,加载模式,并使用种子数据对其进行初始化。
https://edgeguides.rubyonrails.org/active_record_migrations.html#setup-the-database
在这种情况下,如果数据库已经存在,它将以退出状态0返回。我认为当数据库存在时,这是一个合理的假设,我们还假设它已正确植入种子。
set -e
# Building docker image
docker-compose build
# Create db, load the schema and seed it
docker-compose run --rm app bundle exec rails db:setup
# Starting Docker containers
docker-compose up
但是,如果在决定是否需要播种数据库之前需要进行更多检查(例如查询数据库),则可以在seeds.rb
脚本中进行检查。像
return if User.where(name: "Admin").exists? # If Admin user exists we assume DB is properly seeded
悄无声息地吞并bootstrap.sh
脚本中的错误可能不是一个好主意,在这种情况下,您应该更喜欢在seeds.rb
中安装安全网,而不要出错。否则,您最终可能会损坏数据。