基于 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 复制代码
/apprails new myapp --database=postgresql --css=sass --skip-bundle

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

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

添加 Dockerfile

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

bash 复制代码
FROM ruby:3.2

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

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

WORKDIR /app

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

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

添加 docker-compose.yml

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

bash 复制代码
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 镜像,并通过环境变量设置了初始密码。

构建镜像

执行以下命令:

bash 复制代码
$ 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

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

bash 复制代码
arduino
 代码解读
复制代码
$ docker compose run web bash

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

然后执行 bundle:

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

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

准备数据库

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

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

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

然后执行以下命令:

bash 复制代码
/app# bin/setup

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

启动 web service

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

bash 复制代码
$ docker compose up

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


第二种方法

下载ServBay

ServBay 是一个一站式开发环境管理工具,带多种开发语言和数据库组件,包括 ++PHP++ 、++Nodejs++ 等开发语言,++MariaDB++ (MySQL)、++PostgreSQL++ 等关系型数据库,以及 ++Redis++ 、++Memcached++ 等 NoSQL 数据库

要配置redis的环境,只需要在ServBay中,点击下载redis的软件包,即可完成所有配置。

两种方法,大家根据自己的需要选择就好。

相关推荐
Victor随笔集40 分钟前
Linux常用指令
linux·运维·服务器
ihengshuai1 小时前
使用Docker搭建npm私有仓库
前端·docker·容器·npm·devops
浪浪山小白兔1 小时前
使用Supervisor在Ubuntu中实现后台自启动服务
运维·服务器·ubuntu
Juicedata2 小时前
多云架构,JuiceFS 如何实现一致性与低延迟的数据分发
运维·云原生·架构
大熊程序猿2 小时前
drawDB docker部属
运维·docker·容器
binqian4 小时前
【Docker】安装registry本地镜像库,开启Https功能
java·docker·https
悟纤4 小时前
Docker入门篇[SpringBoot之Docker实战系列] - 第534篇
spring boot·docker·eureka
网络安全-杰克5 小时前
网络安全概论——防火墙原理与设计
网络·web安全·php
杰克逊的日记5 小时前
k8s的ip地址分别都是从哪里来的
tcp/ip·容器·kubernetes