我无法弄清楚的一件事是如何在我们 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
文件(用户名,主机等)中相同的数据库值。
谢谢。
答案 0 :(得分:1)
这是我来的解决方案。
˚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"]
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:
.env/development/database
文件,如下所示:P
POSTGRES_USER=postgres
POSTGRES_DB=myapp_development
.env/development/web
文件,如下所示: DATABASE_HOST=database
database.yml
中的设置,如下所示,以便能够读取env变量值: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容器中运行代码:
docker-compose build web
(其中web
是我之前在docker-compose.yml
中声明的服务名称。)docker-compose up --build
启动并构建它。docker-compose run --rm web rails db:create
。docker-compose exec web rails db:migrate
。 docker-compose exec web rails db:create db:migrate
。希望这有帮助。