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

时间:2018-06-18 14:54:04

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

我无法弄清楚的一件事是如何在我们 dockerize 一个Rail应用程序的情况下设置数据库主机?例如,Postgres DB应该在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:

大多数示例假设从容器内部执行与开发Rails相关的所有命令(创建模型,迁移等),例如

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
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: rails5-ember_development

这样,每个人都可以克隆项目,并在Posthost数据库运行在localhost上时继续开发。现在当 dockerizing 应用程序时,如何更改/调整主机值,默认情况下为localhost:5432,以便应用程序可以在Docker容器中运行?

所以,恢复我的问题是:

为了能够在dockerized Rails应用程序中模拟相同的行为,唯一的解决方案是在development以外的特殊环境中运行它吗?在这种情况下,我将其添加到database.yml并设置与docker-compose.yml文件(用户名,主机等)中相同的数据库值。

谢谢。

1 个答案:

答案 0 :(得分:1)

这是我来的解决方案。

  1. 在Rails应用程序中创建一个Dockerfile,如下所示:
  2. ˚F

    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"]
    
    1. 按如下方式创建docker-compose.yml
    2. v

      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:
      
      1. 创建.env/development/database文件,如下所示:
      2. P

        POSTGRES_USER=postgres
        POSTGRES_DB=myapp_development
        
        1. 创建.env/development/web文件,如下所示:
        2. DATABASE_HOST=database

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

            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
            

            现在,您可以像rails s一样照常运行rails应用程序,它可以正常运行。这同样适用于运行所有Rails生成器,迁移等 - 它将在本地工作并与Postgresql DB进行通信。

            在docker容器中运行代码:

            1. 运行docker-compose build web(其中web是我之前在docker-compose.yml中声明的服务名称。)
            2. 或者只需使用docker-compose up --build启动并构建它。
            3. 导航到您的某条路线以检查其是否有效。
            4. 如果数据库尚不存在,请创建数据库:docker-compose run --rm web rails db:create
            5. 运行一些待处理的迁移,如果有一些:docker-compose exec web rails db:migrate
            6. 您可以将两者结合使用:docker-compose exec web rails db:create db:migrate
            7. 希望这有帮助。