安装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”列表是空的。
请在终端中执行以下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服务器的初始页面,那就没问题了。