使用 Structure.sql 中的架构在 Docker 中运行 `rails db:setup`

Dav*_*Ham 5 postgresql ruby-on-rails docker

我有一个新的 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)
Run Code Online (Sandbox Code Playgroud)

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

如果我的 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:
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*Ham 4

我尝试了几件事——运行rails db:create,然后db:migrate可以设置本地数据库,但从长远来看它不会起作用,因为当您运行时rails db:migrate,在任务结束时它会转储模式。使用 Postgres 并schema_format设置为:sql(生成文件的内容structure.sql)时,rake 任务依赖于 Postgres 工具,例如 psql 和 pg_dump。

最后,处理这个问题的最佳方法是将 postgresql-client (不需要整个服务器)添加到 Rails Docker 镜像中。它手头有所需的工具,并且一切正常。