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
,并将apt
和gem
源全都换成国内镜像
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
找到本地生成的项目文件夹后,在项目根目录创建此文件。这里使用了postgres
和redis
,并且将端口隐射到了本机,这样你可以使用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
,将development
和test
段修改为以下内容:
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 即可
进入容器,运行其他命令
如果还需要进入容器运行其他命令,例如rails c
,可以在本机打开一个新的终端窗口后
$ docker exec -it demo_web bash
/app# rails c