使用Docker构建Ruby 3.2 + Rails 7 + MySQL 8开发环境。
创建目录和所需文件
打开你的终端:
mkdir rails_app
cd rails_app
# MySQL环境
mkdir -p db/data
touch db/my.cnf db/data/.keep
# Rails环境
mkdir api
touch api/Dockerfile api/Gemfile api/Gemfile.lock api/entrypoint.sh
创建compose.yml文件
//compose.yml
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
TZ: "Asia/Shanghai"
volumes:
- ./db/my.cnf:/etc/mysql/conf.d/my.cnf
- ./db/data:/var/lib/mysql
ports:
- '3306:3306'
restart: always
api:
build:
context: .
dockerfile: ./api/Dockerfile
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -e development -p 3000 -b '0.0.0.0'"
volumes:
- ./api:/api
ports:
- '3000:3000'
depends_on:
- db
stdin_open: true
tty: true
此文件定义了db
和api
两个服务。db
服务使用mysql:8.0镜像,指定了环境变量,定义了绑定的卷,并将容器的3306端口映射到主机的3306端口。api
服务从Dockerfile构建镜像,设定了启动命令,将容器的3000端口映射到主机的3000端口。
配置my.cnf
这个配置文件主要设定了MySQL服务器和客户端的默认字符集。
//my.cnf
[mysqld]
# 字符代码/排序规则设置
character_set_server = utf8mb4
collation_server = utf8mb4_bin
# 配置默认身份验证插件
default-authentication-plugin = mysql_native_password
[mysql]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
配置api/Dockerfile
使用ruby:3.2.2
作为基础镜像,创建了一个工作目录/api
,并将Gemfile
和Gemfile.lock
拷贝到工作目录。然后运行bundle install
来安装Gemfile
指定的依赖。最后复制了本地的entrypoint.sh
到容器的/usr/bin
目录,并设定了容器启动时的默认命令。
FROM ruby:3.2.2
RUN mkdir /api
WORKDIR /api
COPY ./api/Gemfile Gemfile
COPY ./api/Gemfile.lock Gemfile.lock
RUN bundle install
COPY . /api
COPY ./api/entrypoint.sh /usr/bin/entrypoint.sh
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
配置api/entrypoint.sh
该脚本移除server.pid
文件,然后执行传给脚本的所有参数作为命令。
#!/bin/bash
set -e
rm -f /sample/tmp/pids/server.pid
exec "$@"
配置api/Gemfile
此文件定义了项目依赖的gem
包,包括rails
版本。
source 'https://rubygems.org'
gem 'rails', '~>7.0.8'
api/Gemfile.lock
是个空文件
创建Rails应用程序
在终端中运行以下命令,创建新的Rails程序:
# 使用api模式创建
docker compose run --rm api rails new . --force --no-deps --database=mysql --api --skip-test
# 构建镜像
docker compose build api
编辑database.yml文件设置
这个文件定义了数据库的配置。其中包括适配器类型,编码方式,连接池大小,用户名,密码和主机。
//api/config/database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: <%= ENV.fetch("MYSQL_USERNAME", "root") %>
password: <%= ENV.fetch("MYSQL_PASSWORD", "password") %>
host: <%= ENV.fetch("MYSQL_HOST", "db") %>
development:
<<: *default
database: rails_app_development
创建数据库
在终端中运行以下命令,创建新的数据库:
docker compose run --rm api rails db:create
启动Rails
在终端中运行以下命令,启动Rails服务器:
docker compose up -d api
至此,你已经在Docker上创建了一个包含Ruby 3.2 + Rails 7 + MySQL 8的开发环境。
评论(0)