使用容器进行 Ruby on Rails 开发

先决条件

完成 将 Ruby on Rails 应用程序容器化

概述

在本节中,您将学习如何为容器化应用程序设置开发环境。这包括

  • 添加本地数据库并持久化数据
  • 配置 Compose 在您编辑和保存代码时自动更新正在运行的 Compose 服务

添加本地数据库并持久化数据

您可以使用容器设置本地服务,例如数据库。在本节中,您将更新 compose.yaml 文件以定义数据库服务和用于持久化数据的卷。

在克隆的仓库目录中,用 IDE 或文本编辑器打开 `compose.yaml` 文件。你需要将数据库密码文件作为环境变量添加到服务器服务中,并指定要使用的密钥文件。

以下是更新后的 `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 任务,用于在数据库上运行迁移。迁移是一种随着时间推移以一致且简单的方式更改数据库模式结构的方法。

$ docker exec -it docker-ruby-on-rails-web-1 rake db:migrate RAILS_ENV=test

你将看到类似这样的消息

console == 20240710193146 CreateWhales: 正在迁移 ===================================== -- create_table(:whales) -> 0.0126s == 20240710193146 CreateWhales: 已迁移 (0.0127s) ============================

在浏览器中刷新 https://: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 之前在本地测试和调试你的工作负载。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.