cover

Rails on Docker: 用 Docker Compose 搭建 Rails 7 开发环境

原文地址:https://clwy.cn/guide/pages/docker-clwy-v1-rails-dev

前提条件

如果你对Docker并不太了解,请务必先学习并尝试Rei的Rails on Docker 系列文章

我在Rei这两篇教程的基础上,做了一个相对更完善的,构建更加简便的教程,让Docker方便于Rails的工程开发。

这里使用了:

  • ruby 3.1.0
  • rails 7.0.1
  • postgresql 14.1
  • redis 6.2.6

构建 Rails 基础镜像

任意目录,创建一个文件夹,例如docker-rails,里面新建一个文件Dockerfile-rails-7.0.1

这里使用了ruby 3.1.0,并将aptgem源全都换成国内镜像

FROM ruby:3.1.0

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

# apt 使用阿里云的源
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
    echo "deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >/etc/apt/sources.list && \
    echo "deb-src https://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >>/etc/apt/sources.list && \
    echo "deb https://mirrors.aliyun.com/debian-security/ bullseye-security main" >>/etc/apt/sources.list && \
    echo "deb-src https://mirrors.aliyun.com/debian-security/ bullseye-security main" >>/etc/apt/sources.list && \
    echo "deb https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >>/etc/apt/sources.list && \
    echo "deb-src https://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >>/etc/apt/sources.list && \
    echo "deb https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >>/etc/apt/sources.list && \
    echo "deb-src https://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >>/etc/apt/sources.list

# 如果需要安装其他依赖,修改这段内容
RUN apt-get update && apt-get install -y --no-install-recommends \
  postgresql-client

# 设置 gem 中国镜像,并安装 rails
RUN gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ &&\
    bundle config mirror.https://rubygems.org https://gems.ruby-china.com &&\
    gem install rails -v 7.0.1

# 命令位置
WORKDIR /app

使用以下命令构建镜像,这里我给命令取名为clwy-rails,当然你可以换成其他名字。

$ docker build -f Dockerfile-rails-7.0.1 -t clwy-rails:7.0.1 .

查看镜像列表

$ docker images

会看到

clwy-rails   7.0.1     389b0c8213f6   8 hours ago   986MB

创建项目

运行并进入容器,先cd进入你想放置rails项目的目录

$ docker run -it -v $(pwd):/app -w /app clwy-rails:7.0.1 bash

生成一个叫做demo的项目,这里使用了postgresql。并且跳过bundle,因为后面需要将bundle安装在项目根目录的vendor目录中。

/app# rails new demo -d postgresql --skip-bundle
/app# exit

添加 docker-compose.yml

找到本地生成的项目文件夹后,在项目根目录创建此文件。这里使用了postgresredis,并且将端口隐射到了本机,这样你可以使用Postico或者redis deskop manage连上去进行相关操作。

version: "3.9"

services:
  web:
    container_name: "demo_web"
    image: clwy-rails:7.0.1
    volumes:
      - .:/app
    ports:
      - "3000:3000"
    depends_on:
      - postgres
      - redis
    tty: true
  postgres:
    container_name: "demo_postgres"
    image: postgres:14.1
    ports:
      - "5432:5432"
    environment:
      POSTGRES_PASSWORD: postgres
    volumes:
      - ./data/pgdata:/var/lib/postgresql/data
  redis:
    container_name: "demo_redis"
    image: redis:6.2.6
    ports:
      - "6379:6379"
    volumes:
      - ./data/redis:/data
    command: redis-server

执行 bundle

进入容器的命令行中

$ docker compose run web bash

执行bundle,初始化rails 7的前端相关命令

/app# bundle config set --local path vendor/bundle
/app# bundle install
/app# rails importmap:install
/app# rails turbo:install stimulus:install

记得在.gitignore中添加vendor/bundle

准备数据库

修改database.yml,将developmenttest段修改为以下内容:

development:
  <<: *default
  database: demo_development
  host: postgres
  username: postgres
  password: postgres

test:
  <<: *default
  database: demo_test
  host: postgres
  username: postgres
  password: postgres

执行以下命令,会自动创建数据库

/app# bin/setup
/app# exit

启动 docker 容器

docker容器,全都在后台执行

$ docker compose up -d

进入容器,运行rails服务

$ docker exec -it demo_web bash
/app# rails s -b 0.0.0.0

之所以在这里启动服务,而不是在dockerfile中使用command: bin/rails server -b 0.0.0.0来运行,是因为我觉得在这里可以更直观的调试程序。

访问 http://localhost:3000 即可

image.png

进入容器,运行其他命令

如果还需要进入容器运行其他命令,例如rails c,可以在本机打开一个新的终端窗口后

$ docker exec -it demo_web bash
/app# rails c

image.png

2
@aaron
Ruby 程序员,全栈开发者,clwy.cn 创建者。
加入
更多来自 刘东