Rails 写了个小工具,免安装 Ruby & Rails 开发环境,一键创建项目。

canonpd · 2024年12月31日 · 最后由 VirtumartOz 回复于 2025年01月05日 · 532 次阅读

项目地址:https://github.com/clwy-cn/rails-docked

Rails Docked

一个基于 Docker 的 Rails 开发环境,让你在任何操作系统上都能轻松开发 Rails 应用。

为什么选择 Rails Docked?

  • 🚀 完全隔离的开发环境,避免系统依赖冲突
  • 🔥 预配置中国区镜像源,解决网络问题
  • 💪 内置常用开发依赖,无需繁琐配置
  • 🎯 支持所有主流操作系统(Windows / macOS / Linux)

安装 Rails 开发环境,对于新手来说,非常棘手:

  • 在中国大陆,由于网络环境不够友好,导致安装 RubyRubyGems 非常困难。
  • Rails 项目开发中,经常需要安装一些由 CRust 等语言开发的 Gem 包。这些包在 Windows 中编译安装非常困难。
  • 对于一些老旧 macOS,无法使用 Homebrew 正确安装第三方依赖。例如 Active Storage 中所需要的图片分析工具 vips,在 macOS Monterey 上已无法正确安装了。

为了让大家无论使用什么操作系统的电脑,都能简单、顺利的开发 Ruby On Rails 应用,于是有了 Rails Docked 这个项目。其中,主要参考了 Docked Rails CLI 的相关配置。

环境说明

预置环境包含:

  • Ruby 3.4.1(默认开启 YJIT)
  • Rails 8.0.1
  • Node 22.12.0 + Yarn

预置镜像源包括:

  • apt 命令:阿里云镜像源
  • Ruby Gem:Ruby China 镜像源
  • npm / Yarn:中国镜像源

安装 Docker

首先需要先安装 Docker。如在安装过程出现了问题(常见于 Windows),请参考 Docker 安装教程

创建 Docker 卷

创建一个名为 ruby-bundle-cache 的卷,用于保存 Ruby 项目的依赖包。

docker volume create ruby-bundle-cache

创建项目

macOS、Linux 系统

创建一个名为 docked 的别名:

alias docked='docker run --rm -it \
 -v ${PWD}:/rails \
 -v ruby-bundle-cache:/bundle \
 -p 3000:3000 \
 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked'

创建 rails 项目:

docked rails new weblog -d postgresql

Windows 系统

使用PowerShell,创建一个名为 docked 的别名:

Function docked { docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked $args }

创建 rails 项目:

docked rails new weblog -d postgresql

使用 Docker Compose 配置容器

建好后,用编辑器打开 weblog 项目。在项目根目录下,增加 docker-compose.yml 文件,并添加如下内容:

services:
  web:
    image: "registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked"
    ports:
      - "3000:3000"
    depends_on:
      - postgresql
      - redis
    volumes:
      - .:/rails
      - ruby-bundle-cache:/bundle
    tty: true
    stdin_open: true
    command: ["tail", "-f", "/dev/null"]
  postgresql:
    image: postgres:17
    ports:
      - "5432:5432"
    environment:
      POSTGRES_HOST_AUTH_METHOD: trust
    volumes:
      - ./data/pgdata:/var/lib/postgresql/data
  redis:
    image: redis:7.4
    ports:
      - "6379:6379"
    volumes:
      - ./data/redis:/data
volumes:
  ruby-bundle-cache:
    external: true

其中包含:

  • PostgreSQL 17
  • Redis 7.4

修改数据库连接

修改项目中的 config/database.yml 文件,增加如下数据库配置信息,这样才能连接到容器中的数据库:

default: &default
  # ...
  host: postgresql
  username: postgres

启动项目

  • 启动容器
cd weblog
docker-compose up -d
  • 进入容器
docker-compose exec web bash
  • 安装 Ruby Gems
bundle install
  • 创建数据库
rails db:create
  • 使用脚手架,自动生成增删改查功能(可选)
# 创建路由、模型和迁移文件
rails generate scaffold post title:string body:text

# 迁移数据库
rails db:migrate
  • 启动服务
rails s

等待服务顺利启动后,请访问 http://localhost:3000/posts

常见问题

1. 如何更新

docker pull registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked

2. 如何使用 MySQL 数据库?

如果需要使用 MySQL 替代 PostgreSQL,在创建项目时使用 -d mysql 参数,例如

docked rails new weblog -d mysql

并相应修改 docker-compose.yml 中的数据库配置,例如:

services:
  web:
    image: "registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked"
    ports:
      - "3000:3000"
    depends_on:
      - mysql
      - redis
    volumes:
      - .:/rails
      - ruby-bundle-cache:/bundle
    tty: true
    stdin_open: true
    command: ["tail", "-f", "/dev/null"]
  mysql:
    image: mysql:8.3
    ports:
      - "3306:3306"
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
    volumes:
      - ./data/mysql:/var/lib/mysql
  redis:
    image: redis:7.4
    ports:
      - "6379:6379"
    volumes:
      - ./data/redis:/data
volumes:
  ruby-bundle-cache:
    external: true

同时需要修改 config/database.yml 中的数据库配置:

default: &default
  # ...
  username: root
  password:
  host: mysql

2. 容器启动失败怎么办?

  • 检查端口是否被占用
  • 确保 Docker 服务正在运行
  • 查看容器日志:docker-compose logs

3. macOS、Linux 下如何设置 docked 别名?

在 macOS 和 Linux 系统中,可以通过以下方式设置别名:

# 编辑配置文件(根据你使用的 shell 选择合适的文件)
# 如果使用 bash,编辑 ~/.bashrc
# 如果使用 zsh,编辑 ~/.zshrc

# 在配置文件中添加以下内容
alias docked='docker run --rm -it \
 -v ${PWD}:/rails \
 -v ruby-bundle-cache:/bundle \
 -p 3000:3000 \
 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked'

# 使配置生效
source ~/.bashrc  # 如果使用 bash
# 或
source ~/.zshrc   # 如果使用 zsh

3. Windows 下如何设置 docked 别名?

在 Windows 系统中,可以通过以下方式设置 PowerShell 别名:

# 查看 PowerShell 配置文件的路径
echo $PROFILE
# 输出类似:C:\Users\用户名\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

# 如果该文件不存在,可以使用命令创建
New-Item -Path $PROFILE -Type File -Force

# 用你喜欢的编辑器打开该文件,添加以下内容
Function docked { docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 registry.cn-hangzhou.aliyuncs.com/clwy/rails-docked $args }

注意:在运行 docked rails new xxx 命令时,有可能碰到提示:

无法加载文件 C:\Users\用户名\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1,因为在此系统上禁止运行脚本。

如果碰到这个错误,需要用管理员身份打开 PowerShell,然后运行:

Set-ExecutionPolicy RemoteSigned
# 接着按 A 键继续

许可证

本项目采用 MIT 许可证

前排学习,入门门槛对于其他语言来讲,有点点高

兄弟们,Github Star 点起来。😀 😀 😀

Julie 回复

是啊,环境安装劝退了五成人。😇

新手直接用 docker,感觉包袱有点重

haohaodehao 回复

我安利无数人试试 ruby。但 90% 的人都是 windows,装个环境就直接劝退了。

canonpd 回复

两面性吧,docker 一把梭实际上也掩盖了大量细节,他们同样会很懵,就敲几个命令项目就跑起来了?

刚打瞌睡 枕头就递过来了👍

执行 docker-compose up -d 后 显示 parsing C:\Users\inven\weblog\docker-compose.yml: yaml: line 28: did not find expected key

28 行是 - ./data/redis:/data 属于 redis 块

VirtumartOz 回复

原来是因为最后一个 volumes 缩进问题

这样搞了后 无法在 web 容器内连接 mysql

我的环境是 win12 Docker Desktop 4.24.0

mysql 容器的 ip 是 172.23.0.1,web 容器的 ip 类似 172.18.0.1

能进入 mysql 容器 用 mysql 命令连上 mysqld 服务 然后往 mysql.user 表新增记录 Host 为 172.18.0.1 User 为 root

把 config/database.yml 里 default 块 host 改成<%= ENV.fetch("DB_HOST") { "172.23.0.1" } %>

这样才能正常执行 rails db:create 及以下的命令 并最终跑起来

12 楼 已删除
VirtumartOz 回复

database.yml 里,改为 host: mysql 就可以连啊,直接用docker-compose.yml里配置的名字。

如果你的不能,我不确定哪里出问题了,我一直都是这么用的,并没有碰到过啥问题。

hellorails 回复

重点还是学习 Rails 开发,起码先把项目跑起来的。环境想折腾的,等有点经验了再慢慢搞。

另一个大问题,是为了解决设备兼容性。我这台 MacBook Pro (15-inch, 2016),最高只能装 monterey。基本已经没有办法安装 vips,我编译折腾了数小时也没搞定。

虽然我也有新设备,我还有个 mac mini m4,但是带出门太不方便了。有了这个,不管啥机器都不用操心环境了。

canonpd 回复

我把 host 改成了 mysql 现在错误是 Host '172.18.0.5' is not allowed to connect to this MySQL server 是不是 mysql 容器有配置漏了?

因为我的 docker 容器好像重启过了 web 容器的 ip 变了

VirtumartOz 回复

按道理,IP 变不变,并没有关系。代码中,使用的是docker-compose.yml中的这个名字。

canonpd 回复

mysql 那边的表 mysql.user 有 Host 和 User 限制 Host 就是访问者的 ip User 为 root

ip 变了 就不能访问了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号