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