首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在docker中添加rails应用程序以便可以重复启动的正确方法是什么?

在docker中添加rails应用程序以便可以重复启动的正确方法是什么?
EN

Stack Overflow用户
提问于 2020-06-06 15:22:35
回答 1查看 1.1K关注 0票数 4

我有一个将mysql作为DB的rails应用程序,我正在尝试进行对接,所以我最终可以用docker-machine来部署它。当我第一次运行docker-compose up时,它会正确地初始化并种子数据库,就像它应该做的那样。但是,在我第二次运行docker-compose up时关闭它之后,它会失败,出现以下错误,因为种子内容已经存在:

代码语言:javascript
复制
web_1     | ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry 'antun@example.com' for key 'index_users_on_email'

在我的docker-compose.yml文件中,我在web服务下执行以下操作:

代码语言:javascript
复制
command: /bin/sh -c "bin/wait-for db:3306 -- rm -f /home/ubuntu/MY_APP/tmp/pids/server.pid && bundle exec rake db:create db:migrate db:seed && rails server puma -p 80"

我用的是!由于我理解这被认为是最佳实践,所以在db/seeds.rb中采用方法方法:

代码语言:javascript
复制
u = User.new(
  {email: "antun@example.com", encrypted_password: "XXXXX", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, first_name: "Antun", last_name: "LAST_NAME", provider: "facebook", uid: "12345", username: "antun"}
) 
u.save!(validate: false)

我知道我可以跳过!在u.save!()中,但是正如我所说的,我理解在种子文件中使用它是一个最佳实践,这样它就失败了。我的问题是:什么是正确的,最佳实践的方法,只在第一次运行时创建和播种一个数据库?,一旦它被激活,我想确保应用程序的后续更新(可能包括迁移/新数据类型的附加种子)工作顺利,而不删除数据库中的数据。

下面是完整的docker-compose.yml文件:

代码语言:javascript
复制
docker-compose.yml

    version: '3.1'
    services:
      db:
        image: mysql:5.6
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --init-connect='SET NAMES UTF8;' --innodb-flush-log-at-trx-commit=0
        environment:
          MYSQL_ROOT_PASSWORD: XXXXX
          MYSQL_DATABASE: XXXXX
          MYSQL_USER: XXXXX
          MYSQL_PASSWORD: XXXXX
      web:
        build: .
        command: /bin/sh -c "bin/wait-for db:3306 -- rm -f /home/ubuntu/MY_APP/tmp/pids/server.pid && bundle exec rake db:create db:migrate db:seed && rails server puma -p 80"
        volumes: 
          - $PWD:/MY_APP
        ports:
          - "80:80"
        links:
          - "db:database" 
        env_file:
          - .env.production
        depends_on:
          - db
      worker:
        build: .
        command: /bin/sh -c "bundle exec bin/delayed_job -n 1 --log-dir=/home/ubuntu/MY_APP/shared/log/delayed_job.log --pool='notifications-poller:1' --pool='broadcast,default,elasticsearch,firebase:2' restart && bundle exec shoryuken --logfile '/home/ubuntu/MY_APP/shared/log/shoryuken.log' --config '/home/ubuntu/MY_APP/config/shoryuken_staging.yml' -R"
        links:
          - "db:database"
        volumes:
          - $PWD:/MY_APP
          - '/home/ubuntu/MY_APP/node_modules'
        env_file:
          - .env.production
        depends_on:
          - db
EN

回答 1

Stack Overflow用户

发布于 2020-06-06 15:30:57

试着用ActiveRecord::Relation#find_or_create_by代替:

代码语言:javascript
复制
User.find_or_create_by(email: "antun@example.com", encrypted_password: "XXXXX", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, first_name: "Antun", last_name: "LAST_NAME", provider: "facebook", uid: "12345", username: "antun")

回答您的评论;恐怕存储库已经没有维护了,但是您可以使用我刚刚为此创建的分支

如果您看到这些更改,您可以:

代码语言:javascript
复制
SeedDump.dump(ModelName, method: :find_or_create_by)
# "ModelName.find_or_create_by([\n  {name: \"<name>\", status: nil},\n...)\n"

回答你最后的评论和你的问题:

在docker中添加rails应用程序以便可以重复启动的正确方法是什么?

我不知道这是否正确,但这很简单;在使用MySQL时,只需使用它提供的工具即可。您可以从任何环境转储和导入数据,这将保持数据的完整性,这可能会更快、更容易出错。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62233831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档