【问题标题】:Is it possible to return true even when `docker-compose run` command fails?即使`docker-compose run`命令失败,是否有可能返回true?
【发布时间】:2020-07-17 04:25:32
【问题描述】:

我有一个包含 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 退出的一件事。 docker-compose run --rm app bundle exec rails db:seed ; exit 0" 你的命令应该可以正常工作docker-compose run --rm app bundle exec rails db:seed || true
  • @Adiii 没用。

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


【解决方案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 中有一个安全网,而不是没有错误。否则你可能会得到损坏的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 2021-06-15
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多