使用容器进行 Ruby on Rails 开发
先决条件
概述
在本节中,你将学习如何为容器化应用程序设置开发环境。这包括
- 添加本地数据库并持久化数据
- 配置 Compose 以便在你编辑和保存代码时自动更新正在运行的 Compose 服务
添加本地数据库并持久化数据
你可以使用容器设置本地服务,例如数据库。在本节中,你将更新 compose.yaml
文件来定义数据库服务和一个用于持久化数据的卷。
在克隆的仓库目录中,使用 IDE 或文本编辑器打开 compose.yaml
文件。你需要将数据库密码文件作为环境变量添加到 server 服务,并指定要使用的 secret 文件。
以下是更新后的 compose.yaml
文件。
services:
web:
build: .
command: bundle exec rails s -b '0.0.0.0'
ports:
- "3000:3000"
depends_on:
- db
environment:
- RAILS_ENV=test
env_file: "webapp.env"
db:
image: postgres:latest
secrets:
- db-password
environment:
- POSTGRES_PASSWORD_FILE=/run/secrets/db-password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
secrets:
db-password:
file: db/password.txt
注意
要详细了解 Compose 文件中的指令,请参阅 Compose 文件参考。
在使用 Compose 运行应用程序之前,请注意此 Compose 文件指定了一个 password.txt
文件来存储数据库密码。你必须创建此文件,因为它不包含在源仓库中。
在克隆的仓库目录中,创建一个名为 db
的新目录,并在该目录中创建一个名为 password.txt
的文件,其中包含数据库密码。使用你喜欢的 IDE 或文本编辑器,将以下内容添加到 password.txt
文件中。
mysecretpassword
保存并关闭 password.txt
文件。此外,在 webapp.env
文件中,你可以更改连接数据库的密码。
现在,你的 docker-ruby-on-rails
目录中应该包含以下内容。
.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── README.md
├── Rakefile
├── app/
├── bin/
├── compose.yaml
├── config/
├── config.ru
├── db/
│ ├── development.sqlite3
│ ├── migrate
│ ├── password.txt
│ ├── schema.rb
│ └── seeds.rb
├── lib/
├── log/
├── public/
├── storage/
├── test/
├── tmp/
└── vendor
现在,运行以下 docker compose up
命令来启动你的应用程序。
$ docker compose up --build
在 Ruby on Rails 中,db:migrate
是一个 Rake 任务,用于在数据库上运行迁移。迁移是一种随着时间推移以一致且简单的方式更改数据库 schema 结构的方法。
$ docker exec -it docker-ruby-on-rails-web-1 rake db:migrate RAILS_ENV=test
你将看到类似如下的消息
console == 20240710193146 CreateWhales: migrating ===================================== -- create_table(:whales) -> 0.0126s == 20240710193146 CreateWhales: migrated (0.0127s) ============================
在浏览器中刷新 http://localhost:3000 并添加鲸鱼。
在终端中按 ctrl+c
停止应用程序,然后再次运行 docker compose up
,鲸鱼数据将被持久化。
自动更新服务
使用 Compose Watch 在你编辑和保存代码时自动更新正在运行的 Compose 服务。有关 Compose Watch 的更多详细信息,请参阅 使用 Compose Watch。
使用 IDE 或文本编辑器打开你的 compose.yaml
文件,然后添加 Compose Watch 指令。以下是更新后的 compose.yaml
文件。
services:
web:
build: .
command: bundle exec rails s -b '0.0.0.0'
ports:
- "3000:3000"
depends_on:
- db
environment:
- RAILS_ENV=test
env_file: "webapp.env"
develop:
watch:
- action: rebuild
path: .
db:
image: postgres:latest
secrets:
- db-password
environment:
- POSTGRES_PASSWORD_FILE=/run/secrets/db-password
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
secrets:
db-password:
file: db/password.txt
运行以下命令以使用 Compose Watch 运行你的应用程序。
$ docker compose watch
现在,对本地机器上应用程序源文件的任何更改将立即反映在正在运行的容器中。
使用 IDE 或文本编辑器打开 docker-ruby-on-rails/app/views/whales/index.html.erb
,并通过添加感叹号来更新 Whales
字符串。
- <h1>Whales</h1>
+ <h1>Whales!</h1>
保存对 index.html.erb
的更改,然后等待几秒钟让应用程序重新构建。再次访问应用程序,并验证更新后的文本是否显示。
在终端中按 ctrl+c
停止应用程序。
总结
在本节中,你了解了如何设置 Compose 文件以添加本地数据库并持久化数据。你还学习了如何使用 Compose Watch 在更新代码时自动重新构建并运行你的容器。
相关信息
后续步骤
在下一节中,你将学习如何在部署到 Kubernetes 之前,在本地测试和调试你的工作负载。