使用容器进行 Ruby on Rails 开发

先决条件

完成 容器化 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 之前,在本地测试和调试你的工作负载。

页面选项