github编辑

实战 Rails

本小节内容适合 Ruby 开发人员阅读。

本节使用 Docker Compose 配置并运行一个 Rails + PostgreSQL 应用。

架构概览

┌─────────────────────────────────────────────────────────────┐
│                     Docker Compose 网络                     │
│                                                             │
│  ┌─────────────────────┐      ┌─────────────────────┐       │
│  │     web 服务         │      │      db 服务        │       │
│  │  ┌───────────────┐  │      │  ┌───────────────┐  │       │
│  │  │   Rails       │  │──────│  │  PostgreSQL   │  │       │
│  │  │   应用        │  │ :5432│  │   数据库      │  │       │
│  │  └───────────────┘  │      │  └───────────────┘  │       │
│  │       :3000         │      │                     │       │
│  └──────────┬──────────┘      └─────────────────────┘       │
│             │                                               │
└─────────────┼───────────────────────────────────────────────┘


         localhost:3000

准备工作

创建项目目录:

需要创建三个文件:DockerfileGemfiledocker-compose.yml

Step 1: 创建 Dockerfile

配置说明

指令
作用

build-essential

编译原生扩展所需

libpq-dev

PostgreSQL 客户端库

nodejs

Rails Asset Pipeline 需要

先复制 Gemfile

只有依赖变化时才重新 bundle install

Step 2: 创建 Gemfile

创建一个初始的 Gemfile,稍后会被 rails new 覆盖:

创建空的 Gemfile.lock

Step 3: 创建 docker-compose.yml

配置详解

配置项
说明

rm -f tmp/pids/server.pid

清理上次异常退出留下的 PID 文件

volumes: .:/myapp

挂载代码目录,支持热更新

depends_on: db

确保数据库先启动

DATABASE_URL

Rails 12-factor 风格的数据库配置

Step 4: 生成 Rails 项目

使用 docker compose run 生成项目骨架:

命令解释

  • --rm:执行后删除临时容器

  • --force:覆盖已存在的文件

  • --database=postgresql:配置使用 PostgreSQL

  • --skip-bundle:暂不安装依赖(稍后统一安装)

生成的目录结构:

⚠️ Linux 用户:如遇权限问题,执行 sudo chown -R $USER:$USER .

Step 5: 重新构建镜像

由于生成了新的 Gemfile,需要重新构建镜像以安装完整依赖:

Step 6: 配置数据库连接

修改 config/database.yml

💡 使用 DATABASE_URL 环境变量配置数据库,符合 12-factor 应用原则,便于在不同环境间切换。

Step 7: 启动应用

输出示例:

Step 8: 创建数据库

在另一个终端执行:

访问 http://localhost:3000 查看 Rails 欢迎页面。

常用开发命令

常见问题

Q: 数据库连接失败

检查 DATABASE_URL 环境变量格式是否正确,确保 db 服务已启动:

Q: server.pid 文件导致启动失败

错误信息:A server is already running

已在 command 中添加 rm -f tmp/pids/server.pid 处理。如仍有问题:

Q: Gem 安装失败

可能需要更新 bundler 或清理缓存:

开发 vs 生产

配置项
开发环境
生产环境

Rails 服务器

Puma (开发模式)

Puma + Nginx

代码挂载

使用 volumes

代码打包进镜像

静态资源

动态编译

预编译 (rails assets:precompile)

数据库密码

明文配置

使用 Secrets 管理

延伸阅读

最后更新于