【问题标题】:Rails with Docker-compose: how to set up database hostRails 与 Docker-compose:如何设置数据库主机
【发布时间】:2018-06-18 14:54:04
【问题描述】:

我想不通的一件事是如何设置数据库主机以防我们 dockerize Rail 应用程序?例如,Postgres DB 应该在开发机器上的 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

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

所以,继续我的问题是:

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

谢谢。

【问题讨论】:

  • 您能调整一下您的问题吗?很难理解到底是什么问题!
  • 我已经更新了问题,请参阅最后一段。谢谢。
  • 我还是不明白你想达到什么目的。
  • @emix:我希望能够:将 Rails 应用程序 dockerize 并让它以相同的方式运行:在 Docker 容器中和本地,即能够在无需运行 Rails 生成器命令的经典方式,无需在它们前面加上 docker-compose exec ...
  • 如果我理解正确的话,你可以告诉 docker-compose 使用特定的入口点来实例化你的容器。您可以在 separate docker-compose 文件中执行此操作。

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


【解决方案1】:

这是我想到的解决方案。

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

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

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文件如下:

P

POSTGRES_USER=postgres
POSTGRES_DB=myapp_development
  1. 创建.env/development/web文件如下:

DATABASE_HOST=database

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

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 数据库通信。

在 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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多