在我之前的实验中,我展示了如何让一个成熟的(即预先存在的)Rails应用在Visual Studio Code devcontainer中启动,靠的是VS Code的Remote-Container扩展提供的默认配置。这是一个很大的进步,但我从来没有在一个真正的、生产中的Rails应用上工作过,而这个应用不依赖于某种数据库。
因此,在我的下一批实验中,我探索了在开发容器中添加数据库支持所需要的东西。我原本打算在一篇文章中介绍三种最常见的基于SQL的数据库,但以这种方式介绍基于容器的Postgres、MySQL和SQLite设置的细节和差异,对我的口味来说有点过于庞杂。相反,我打算把它分解成多篇文章。
在这里,我将介绍如何在Visual Studio Code中为Rails开发容器设置SQLite。尽管这是最简单的,甚至可能看起来不需要很多额外的设置就能工作,但理解为什么会出现这种情况,就能从根本上理解VS Code和Remote-Container为我们设置的容器功能的一些重要东西。所以让我们开始吧。
使用现有的SQLite数据库
如果你遵循本系列第二部分的设置步骤,并且你的应用程序使用SQLite作为数据库,你可能已经观察到应用程序只是在Rails控制台或浏览器中工作。这是为什么呢?
Docker支持在你的电脑(主机)上映射一个目录,这样它就可以在容器的文件系统中访问。VS Code将其自动设置为一个工作区。你在主机上的工作区目录中所做的改变会应用到容器中,反之亦然。
如果你在一个已经使用了一段时间的现有开发目录中建立一个容器环境,很可能你已经在db/development.sqlite3中有了一个数据库文件。如果是这样的话,那么基于容器的Rails应用就可以像在主机上运行一样轻松地访问数据了。
自动化未来的数据库设置
我不希望未来的开发者不得不手动运行步骤来创建开发数据库并填充其模式。这是一个完美的自动化步骤,无论你是否使用容器,也无论你选择何种数据库引擎。
在版本控制中,将config/database.yml的样本版本存储为config/database.yml.sample或类似的东西,删除敏感和/或环境特定的信息,这是一个好的做法。在使用SQLite进行开发和测试的应用程序中,这种做法可能不那么常见,因为该文件往往不需要保密。
正如本系列第二部分所讨论的,使用创建项目时提供的bin/setup脚本自动设置一个新的Rails开发环境也是一个好的做法。将样本文件复制到Rails可读的初始数据库配置文件的步骤已经在脚本中了;我们只需要取消注释。所以,在bin/setup中:
chdir APP_ROOT do
# ...
puts "\n== Copying sample files =="
unless File.exist?('config/database.yml')
cp 'config/database.yml.sample', 'config/database.yml'
end
# ...
end
看一下样本文件,确保它没有期待任何特定环境的值或秘密。如果没有的话,你应该都准备好了。在我看来,我还没有看到一个需要额外设置的SQLite的Rails数据库配置。
配置文件到位后,让我们添加一个模式和种子数据吧Rails也有内置的支持,bin/setup在这些注释过的行中建议这样做:
# puts "\n== Preparing database =="
# system! 'bin/rails db:setup'
但要小心!db:setup 任务在重新运行时将抹去数据库中的任何现有数据,就像重建一个已经有数据的开发容器时那样。我喜欢我找到的一个解决方法,即只在没有数据库存在的情况下重置数据库模式。(我很高兴我在开发环境而不是生产环境中了解到这种行为!)
在容器中访问数据库控制台
为了使用rails dbconsole 工具来处理使用SQL而不是Active Record的数据,我们需要在容器中安装sqlite3 包。一种选择是使用sudo ,成为容器的root 用户,然后使用apt-get 来安装包。但将这一步骤自动化将使未来建立容器环境的开发者不必手动安装该包。
到目前为止,我们一直在使用的Docker文件包括一个注释过的软件包安装部分。取消注释并添加sqlite3 包:
# [Optional] Uncomment this section to install additional OS packages.
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
&& apt-get -y install --no-install-recommends sqlite3
重建开发容器,当现在熟悉的提示出现在VS Code终端窗格中时,输入bin/rails dbconsole ,确认软件包已经成功安装。(键入.quit ,退出SQLite命令行)。
摘要
网络服务器?检查。Rails控制台?对。数据库(嗯,SQLite数据库)?对!我们的容器开始看起来像一个真正的开发环境。我真的很喜欢SQLite作为简化学习Rails的工具,而且事实证明它很适合在容器内学习Rails的来龙去脉。
在Docker(底层依赖性安装)和Ruby(数据库设置)之间进行分工,在简单性和可维护性方面也不断得到回报。这一趋势会继续吗?