即使`docker-compose run`命令失败,也可能返回true吗?

时间:2020-07-17 04:25:32

标签: ruby-on-rails docker docker-compose

我有一个脚本文件,其中包含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?

1 个答案:

答案 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中安装安全网,而不要出错。否则,您最终可能会损坏数据。