github编辑

11.7 实战 Rails

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

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

11.7.1 架构概览

如图 10-2 所示,Rails 与 PostgreSQL 在同一 Compose 网络中协同工作。

spinner

图 10-2 Rails + PostgreSQL 的 Compose 架构

11.7.2 准备工作

创建项目目录:

$ mkdir rails-docker && cd rails-docker

需要创建三个文件:DockerfileGemfilecompose.yaml

11.7.3 步骤 1:创建 Dockerfile

如下代码块所示,展示了相关示例:

FROM ruby:3.2

## 安装系统依赖

RUN apt-get update -qq && \
    apt-get install -y build-essential libpq-dev nodejs && \
    rm -rf /var/lib/apt/lists/*

## 设置工作目录

WORKDIR /myapp

## 先复制 Gemfile,利用缓存加速构建

COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

## 复制应用代码

COPY . /myapp

配置说明

指令
作用

build-essential

编译原生扩展所需

libpq-dev

PostgreSQL 客户端库

nodejs

Rails Asset Pipeline 需要

先复制 Gemfile

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

11.7.4 步骤 2:创建 Gemfile

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

创建空的 Gemfile.lock

11.7.5 步骤 3:创建 compose.yaml

配置如下:

配置详解

配置项
说明

rm -f tmp/pids/server.pid

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

volumes: .:/myapp

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

depends_on: db

确保数据库先启动

DATABASE_URL

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

11.7.6 步骤 4:生成 Rails 项目

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

命令解释

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

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

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

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

生成的目录结构:

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

11.7.7 步骤 5:重新构建镜像

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

11.7.8 步骤 6:配置数据库连接

修改 config/database.yml

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

11.7.9 步骤 7:启动应用

运行以下命令:

输出示例:

11.7.10 步骤 8:创建数据库

在另一个终端执行:

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

11.7.11 常用开发命令

运行以下命令:

11.7.12 常见问题

本节涵盖了相关内容与详细描述,主要探讨以下几个方面:

Q:数据库连接失败

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

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

错误信息:A server is already running

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

Q:Gem 安装失败

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

11.7.13 开发 vs 生产

相关信息如下表:

配置项
开发环境
生产环境

Rails 服务器

Puma (开发模式)

Puma + Nginx

代码挂载

使用 volumes

代码打包进镜像

静态资源

动态编译

预编译 (rails assets:precompile)

数据库密码

明文配置

使用 Secrets 管理

11.7.14 延伸阅读

最后更新于