基于 docker 搭建 rails 开发环境

思路

先开启一个临时的 Ruby 容器,在容器内创建项目,之后再构建开发需要的镜像。

新建项目

为了创建一个 Rails 项目,先启动一个临时的 Ruby 容器:

ruby 复制代码
$ docker run -it -v $(pwd):/app -w /app ruby:3.2 bash

在容器内安装 Rails gem:

bash 复制代码
/app# gem install rails

然后创建项目:

bash 复制代码
/app# rails new myapp --database=postgresql --css=sass --skip-bundle

这里使用了--skip-bundle参数,因为这只是个临时容器,稍后会在开发容器内执行 bundle

现在这个临时容器已经完成使命,按 ctrl-d 或者输入 exit 退出容器。

添加 Dockerfile

在项目目录下添加Dockerfile文件,输入以下内容:

ini 复制代码
FROM ruby:3.2

# ruby 镜像预设的这个环境变量干扰了后面的操作,将它重置为默认值
ENV BUNDLE_APP_CONFIG=.bundle

# 如果需要安装其他依赖,取消这段注释
# RUN apt-get update && apt-get install -y --no-install-recommends \
#   nodejs \
#   npm \
#   postgresql-client

WORKDIR /app

这是一个最精简的 Rails 开发环境镜像,如果有需要可以用apt-get安装其他系统依赖。

现在还不需要构建镜像,稍后我们会用docker compose命令一起构建。

添加 docker-compose.yml

在项目目录下添加docker-compose.yml文件,输入以下内容:

yaml 复制代码
version: "3.9"

services:
  web:
    build: .
    command: bin/rails server -b 0.0.0.0
    volumes:
      - .:/app
    ports:
      - 3000:3000
    depends_on:
      - postgres
  postgres:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: postgres

这里定义了 web 和 postgres services。web service 会基于当前目录下的 Dockerfile 文件构建镜像,并且挂载当前目录到容器内的 /app 目录,释出 3000 端口,并且添加了对 postgres servcie 的启动依赖。postgres service 会使用 postgres 镜像,并通过环境变量设置了初始密码。

构建镜像

执行以下命令:

ruby 复制代码
$ docker compose build

Docker Compose 会读取 docker-compose.yml 中的配置,构建相应的镜像。

注意:每次修改 Dockerfile 后都要重新执行这个命令。

进入命令行

执行以下命令:

arduino 复制代码
$ docker compose run web bash

这样就会启动 web service 容器,并且打开一个 bash shell。在这个 shell 中我们可以执行本地开发时需要执行的命令,例如 bundle install,bin/rails g 等。

后面需要在容器内执行的操作都会通过这个 shell 执行。

执行 bundle

首先在容器内执行以下命令:

shell 复制代码
/app# bundle config set --local path vendor/bundle

这个命令将 bundle 的安装目录设为项目下的 vendor/bundle 目录。因为我不希望开发的时候每次更新 Gemfile 都要重新构建镜像。

然后执行 bundle:

bash 复制代码
/app# bundle install

注意:记得在 .gitignore 中添加 vendor/bundle。

准备数据库

在创建数据库前先要修改 Rails 项目的数据库设置,因为在 Docker Compose 搭建的环境中,PostgreSQL 跟 Rails 进程运行在不同的容器中,类似于不同的主机,service 名就是各自的网络名。

修改database.yml,在developmenttest段加入以下内容:

yaml 复制代码
  host: postgres
  username: postgres
  password: postgres

然后执行以下命令:

bash 复制代码
/app# bin/setup

之后便会创建相应的数据库。

启动 web service

经过上面的准备,是时候启动 web service 了。打开另一个终端,输入以下命令:

ruby 复制代码
$ docker compose up

启动完成后,打开 http://localhost:3000 就能看到 Rails 的启动页面了

一种更简单的方式

偶然看大佬的分享发现的:rails/docked

先运行下面的命令:

ruby 复制代码
$ docker volume create ruby-bundle-cache
$ alias docked='docker run --rm -it -v ${PWD}:/rails -v ruby-bundle-cache:/bundle -p 3000:3000 ghcr.io/rails/cli'

然后创造你的 rails 应用:

shell 复制代码
$ docked rails new weblog
$ cd weblog
$ docked rails generate scaffold post title:string body:text
$ docked rails db:migrate
$ docked rails server

一般我会用这个生成一个初始化项目,然后配置好 docker,最后用 docker 做后续的开发

自己的快速搭建模板

docker-rails-project-temp

目前支持的功能:

  • Docker
  • dotenv
  • PosgreSQL
  • Redis
  • turbo
  • Github Actions
  • Brakeman
  • All other Rails default stack

参考资料:

  1. Rails on Docker: 用 Docker Compose 搭建开发环境
  2. 用 Docked Rails CLI 启动新手环境
  3. 用 Docker 构建开发环境
相关推荐
showmethetime18 小时前
RabbitMQ实用技巧
分布式·rabbitmq·ruby
ghie909019 小时前
SpringCloud-基于SpringAMQP实现消息队列
后端·spring cloud·ruby
bubiyoushang8882 天前
RabbitMQ如何保证消息可靠性
分布式·rabbitmq·ruby
计算机毕设定制辅导-无忧学长2 天前
RabbitMQ 监控与调优实战指南(二)
分布式·rabbitmq·ruby
二楼后座。3 天前
mac安装brew时macos无法信任ruby的解决方法
开发语言·macos·ruby
路由侠内网穿透5 天前
本地部署消息代理软件 RabbitMQ 并实现外部访问( Windows 版本 )
服务器·开发语言·windows·数据分析·rabbitmq·ruby
开开心心_Every5 天前
功能丰富的PDF处理免费软件推荐
运维·笔记·qt·智能手机·pdf·音视频·ruby
计算机毕设定制辅导-无忧学长9 天前
RabbitMQ 可靠性保障:消息确认与持久化机制(二)
分布式·rabbitmq·ruby
计算机毕设定制辅导-无忧学长10 天前
RabbitMQ 集群与高可用方案设计(二)
分布式·rabbitmq·ruby
花心蝴蝶.11 天前
RabbitMQ 概述
分布式·rabbitmq·ruby