首页
Preview

搭建Rails 7+MySQL的Docker环境

使用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

此文件定义了dbapi两个服务。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,并将GemfileGemfile.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的开发环境。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
南方姑娘
站在巨人的肩膀上

评论(0)

添加评论