带Docker compose的Rails:如何设置数据库主机

带Docker compose的Rails:如何设置数据库主机,docker,docker-compose,ruby-on-rails-5,Docker,Docker Compose,Ruby On Rails 5,有一件事我搞不懂,那就是如何设置数据库主机,以防我们将Rail应用程序dockerize?例如,Postgres数据库应该在dev机器上的localhost上运行。但在docker compose文件中,数据库服务有自己的名称,-在该主机上,其他容器可以访问数据库,例如: version: '3' services: web: build: . ports: - "3000:3000" volumes: - .:/usr/src/app

有一件事我搞不懂,那就是如何设置数据库主机,以防我们将Rail应用程序dockerize?例如,Postgres数据库应该在dev机器上的localhost上运行。但在docker compose文件中,数据库服务有自己的名称,-在该主机上,其他容器可以访问数据库,例如:

version: '3'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/usr/src/app
    env_file:
      - .env/development/database
      - .env/development/web
  redis:
    image: redis
  database:
    image: postgres
    env_file:
      - .env/development/database
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:
大多数示例假设从容器内部执行与开发轨道相关的所有命令(创建模型、迁移等),例如

docker-compose exec web rails g scaffold User first_name:string last_name:string
要运行上面的迁移,我必须运行

docker-compose exec web rails db:migrate
这样就行了。但是为什么我需要在本地运行Docker以便我的开发人员能够访问该应用程序呢

所以我回到我最初的基本问题: 生成应用程序时,database.yml具有以下设置(对于Postgres):

default:&default
适配器:postgresql
编码:unicode
游泳池:
发展:

这是我想到的解决办法

  • 在Rails应用程序中创建Dockerfile,如下所示:
  • F

  • 创建
    .env/development/database
    文件,如下所示:
  • p

  • 创建
    .env/development/web
    文件,如下所示:
  • DATABASE\u HOST=DATABASE

  • 更改
    database.yml
    中的设置,如下所示,以便能够读取环境变量值:
  • d

    default:&default
    适配器:postgresql
    编码:unicode
    主持人:
    用户名:
    数据库:
    游泳池:5
    变量:
    语句超时:5000
    发展:
    
    你能调整一下你的问题吗?很难理解到底是什么问题!我更新了问题,见最后一段。谢谢。我仍然不明白你想要实现什么。@emix:我希望能够:对Rails应用程序进行Docker化,并使其以相同的方式运行:在Docker容器中和本地,也就是说,能够以经典的方式开发应用程序,而无需运行Rails生成器命令,而无需使用
    docker compose exec…
    作为前缀。如果我理解正确,您可以告诉docker compose使用特定的入口点来实例化您的容器。您可以在
    docker compose
    文件中执行此操作。
    default: &default
      adapter: postgresql
      encoding: unicode
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    
    development:
      <<: *default
      database: rails5-ember_development
    
    FROM ruby:2.5.1
    LABEL maintainer="Serguei CAMBOUR <s.cambour@gmail.com>"
    RUN apt-get update -yqq
    RUN apt-get install -yqq --no-install-recommends nodejs
    COPY Gemfile* /usr/src/app/
    WORKDIR /usr/src/app
    RUN bundle install
    COPY . /usr/src/app/
    CMD ["rails", "s", "-b", "0.0.0.0"]
    
    version: '3'
    
    services:
      web:
        build: .
        ports:
          - "3000:3000"
        volumes:
          - .:/usr/src/app
        env_file:
          - .env/development/database
          - .env/development/web
      redis:
        image: redis
      database:
        image: postgres
        env_file:
          - .env/development/database
        volumes:
          - db-data:/var/lib/postgresql/data
    volumes:
      db-data:
    
    POSTGRES_USER=postgres
    POSTGRES_DB=myapp_development
    
    default: &default
      adapter: postgresql
      encoding: unicode
      host: <%= ENV['DATABASE_HOST'] %>
      username: <%= ENV['POSTGRES_USER'] %>
      database: <%= ENV['POSTGRES_DB'] %>
      pool: 5
      variables:
        statement_timeout: 5000
    
    development:
      <<: *default
    
    test:
      <<: *default
      database: myapp_test
    
    production:
      <<: *default