在Docker中运行`rails db:setup`命令,并使用structure.sql作为模式。

5

我有一个新的Rails应用程序,计划在Docker容器中部署。我们使用structure.sql而不是schema.rb。在我的本地设置中(使用docker-compose文件,在单独的容器中使用Postgres),当我运行rails db:setup时,出现以下错误:

rails aborted!
failed to execute:
psql -q -f /rails/db/structure.sql cappy_dev

Please check the output above for any errors and make sure that `psql` is installed in your PATH and has proper permissions.

/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/postgresql_database_tasks.rb:99:in `run_cmd'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/postgresql_database_tasks.rb:71:in `structure_load'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/database_tasks.rb:213:in `structure_load'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/database_tasks.rb:226:in `load_schema'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/database_tasks.rb:253:in `block in load_schema_current'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/database_tasks.rb:292:in `block in each_current_configuration'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/database_tasks.rb:291:in `each'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/database_tasks.rb:291:in `each_current_configuration'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/tasks/database_tasks.rb:252:in `load_schema_current'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/railties/databases.rake:306:in `block (3 levels) in <top (required)>'
/usr/local/bundle/gems/activerecord-5.0.2/lib/active_record/railties/databases.rake:310:in `block (3 levels) in <top (required)>'
/usr/local/bundle/gems/railties-5.0.2/lib/rails/commands/rake_proxy.rb:14:in `block in run_rake_task'
/usr/local/bundle/gems/railties-5.0.2/lib/rails/commands/rake_proxy.rb:11:in `run_rake_task'
/usr/local/bundle/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:51:in `run_command!'
/usr/local/bundle/gems/railties-5.0.2/lib/rails/commands.rb:18:in `<top (required)>'
bin/rails:9:in `require'
bin/rails:9:in `<main>'
Tasks: TOP => db:structure:load
(See full trace by running task with --trace)

这是有道理的,因为我的Rails容器只有Ruby和与Rails相关的工具,没有Postgres或pqsl,这些在Postgres容器中。

如果我的Rails容器中没有psql、pg_dump和其他Postgres工具,我该如何运行rails db:setup(或db:migrate或其他任务)?

更新: 这是我的docker-compose文件:

version: '3'
services:
  postgres:
    image: postgres:9.6
    volumes:
      - cappy-data:/var/lib/postgresql/data
    ports:
      - '5432:5432'
    environment:
      POSTGRES_PASSWORD: postgres

  cappy:
    image: REDACTED.dkr.ecr.us-east-1.amazonaws.com/cappy:latest
    build:
      context: .
    command: rails s -p 3000 -b '0.0.0.0'
    depends_on:
      - postgres
    volumes:
      - .:/rails
    ports:
      - "3000:3000"
    links:
      - "postgres:postgres"
    environment:
      RAILS_ENV: development

volumes:
  cappy-data:

我认为这个文件不是问题所在--db:setup可以创建数据库,只是无法加载structure.sql,因为它似乎找不到psql


请发布您的docker-compose文件。您可能仍然需要链接容器(rails和postgres)。 - bkunzi01
已更新docker-compose文件。 - David Ham
1个回答

4
我尝试了几种方法——运行 rails db:create 然后再运行 db:migrate 可以设置本地数据库,但从长远来看这种方法不可行,因为当你运行 rails db:migrate 时,在任务结束时会丢弃架构。对于Postgres,并且将 schema_format 设置为 :sql(这是生成 structure.sql 文件的方式),rake 任务依赖于 Postgres 工具,如 psql 和 pg_dump。
最终,最好的处理方法是将 postgresql-client(不需要整个服务器)添加到 Rails Docker 镜像中。它有所需的工具,一切都正常运作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接