安装Docker for Mac,创建Rails7 + MySQL8环境

首先

在这篇文章中,我将介绍如何使用最新版本的Rails(即版本7)和MySQL8一起在Docker上构建环境。即使对Docker一无所知,只要按照步骤操作,也可以使用Docker进行环境搭建。
但请注意,本文不会详细介绍Docker。

环境资讯

Mac:MacbookPro(2021年14インチ)
チップ:Apple M1 Pro
OS:Monterey(バージョン12.6.2)

这篇文章的要点是什么?

当您安装名为Docker Desktop的Mac应用程序(以GUI方式运行),您将自动从终端中使用Docker命令。
使用Docker,您无需在自己的计算机上安装Ruby或Rails就能创建开发环境。

所有步骤清单

以下是中文的同义句版本:

步骤1 安装Docker Desktop
步骤2 创建一个能够运行Rails应用程序的Docker容器
步骤3 启动容器并进行Rails应用程序的设置

安装Docker桌面版的步骤1

您可以从以下页面下载Docker桌面应用程序的安装程序。
https://docs.docker.com/desktop/install/mac-install/

在启动安装程序并完成安装的过程中,我没有特别困惑。但在启动安装程序并进行设置的过程中,可能需要进行Docker会员注册。

安装完成后,Docker桌面版会打开一个类似下面的界面。

不必完全匹配,没关系,实际上我还没有进行任何操作,所以我认为”Containers”列表是空的。

jfieewau.png

请在终端中执行以下docker ps命令,并确保结果与示例相同。

# 任意のディレクトリでdocker psコマンドを実行
docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

使用Docker创建能运行Rails应用程序的容器的步骤2

下一步是创建Docker容器,并在其中运行Rails应用程序。本次我们希望运行的Ruby和Rails版本**不会安装在我的个人电脑上**,而是仅在容器中安装和使用。这样做的好处是,不需要在个人电脑上管理各种版本,变得更加轻松。

首先,进入想要创建Rails应用的目录,并在该目录下创建一个名为Dockerfile的新文件。

# Railsアプリを作成したいディレクトリに移動後、Dockerfileというファイルを作成する
touch Dockerfile

接下来,我们将按照以下方式编辑所创建的Dockerfile。

# 一時的なDockerfile
FROM ruby:3.2

# 必要なパッケージのインストール
RUN apt-get update -qq && apt-get install -y nodejs npm
RUN npm install --global yarn

# 作業ディレクトリを設定
WORKDIR /app

# Railsをインストール
RUN gem install rails -v 7.0.5

# ホストのディレクトリをコンテナにマウント
VOLUME /app

通过使用此Dockerfile来创建一个容器,可以准备好安装了Ruby版本3.2和Rails版本7.0.5的镜像。为了创建镜像,在包含先前创建的Dockerfile的目录中运行以下命令。

#Dockerfileが存在するディレクトリで実行
docker build -t rails-generator -f Dockerfile .

下一步,我们将使用已创建的镜像来创建Rails应用程序。执行以下命令,即可创建Rails应用。这将在包含Dockerfile的目录下生成用于Rails应用程序的代码框架。

#Dockerfileが存在するディレクトリで実行
docker run --rm -v ${PWD}:/app rails-generator rails new cat-hotwire --database=mysql --css=bootstrap --skip-jbuilder --skip-action-mailbox --skip-action-mailer --skip-test --skip-active-storage --skip-action-text

PC本体没有安装指定版本的Ruby和Rails,但却创建了作为Rails应用程序模板的代码。这样一来,您可以在自己的PC环境不复杂的情况下编辑应用程序代码。

这次我使用名为cat-hotwire的名称生成了一个Rails应用程序的模板代码。我们可以看到已经创建了一个名为cat-hotwire的目录。

接下来,在创建的Rails应用程序目录中,按照以下内容创建一个名为entrypoint.sh的文件。

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

这个文件在容器启动时扮演了辅助Rails应用程序启动的角色。它会调整Rails所需的进程信息,确保其正确无误,并在容器启动时同时启动Rails服务器。

在放置entrypoint.sh的Rails目录下创建一个名为Dockerfile的文件,并编辑为以下内容。

FROM ruby:3.2.0

# Node.jsとYarnのインストール
RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - && \
    apt-get update && \
    apt-get install -y nodejs default-mysql-client && \
    npm install -y --global yarn && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /myapp

# GemfileとGemfile.lockを先にコピーしてbundle install
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install

# アプリケーションのソースコードをコピー
COPY . /myapp

# Yarnパッケージのインストール
RUN yarn install --check-files

# entrypoint.shの設定
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]

EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

接下来,在同一目录下创建一个名为docker-compose.yml的文件。

version: '3.8'
services:
  db:
    image: mysql:8.0.32
    command: --default-authentication-plugin=mysql_native_password
    container_name: db
    ports:
      - 4306:3306
    volumes:
      - db:/var/lib/mysql
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
      TZ: Asia/Tokyo
    security_opt:
      - seccomp:unconfined
  app:
    tty: true
    stdin_open: true
    container_name: app
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/myapp
      - bundle:/usr/local/bundle
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
    command: bash -c "rm -rf tmp/pids/server.pid && rails server -b 0.0.0.0 -p 3000"
    environment:
      TZ: Asia/Tokyo
    depends_on:
      - db
    ports:
      - 3000:3000
volumes:
  db:
    driver: local
  bundle:
    driver: local
  public-data:
    driver: local
  tmp-data:
    driver: local

接下来,我们将编辑已创建的Rails应用程序的database.yml文件,如下所示。

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  host: db #ここを追加
  database: instalike_development

test:
  <<: *default
  host: db #ここを追加
  database: instalike_test

接下来,转到先前创建的Rails应用程序的目录,并执行docker-compose build命令。

# 作成したディレクトリに移動
cd cat-hotwire
# railsアプリのディレクトリにいることを確認
pwd
# docker-compose buildコマンドを実行
docker-compose build --no-cache

然后,根据docker-compose.yml文件中的设置创建相应的容器。如果没有出现任何错误,就表示一切正常。

第三步,运行容器,进行Rails应用的设置

在Rails应用的目录下,运行docker-compose up命令来启动容器。

docker-compose up -d

只需一个选项。
通过添加-d选项,您可以在终端上继续操作。
如果不加-d选项,当前打开的终端窗口将显示Docker的状态并处于不可用状态。

接下来,我们将在容器中进行Rails的环境配置。在访问创建的Rails应用之前,我们需要先创建一个数据库。请在终端中键入命令,针对容器执行rails db:create命令。

docker compose run app rails db:create

使用docker compose run app命令,可以在应用程序容器的终端中执行命令。

只需使用自己电脑上适当的浏览器,访问URL localhost:3000,如果显示了以下Rails服务器的初始页面,那就没问题了。

jfiewaewau.png
广告
将在 10 秒后关闭
bannerAds