我叫Onoda Kenta(@onoda_kenta)。我是编程的初学者。
作为学习Ruby的一部分,我决定使用Sinatra而不是Rails来创建一个简单的Web应用程序。
我使用Docker来构建环境,但是由于Ruby的图像是Ruby:最新的版本变成了Ruby 3.0.0,在引入它时我有点困惑,所以我想分享一下。
根据结论,
- Webrick已从Ruby 3.0.0中删除
- 执行需要薄,彪马,卷轴,HTTP,Webrick等应用程序服务器
- 如果要使用webrick,请从RubyGems安装
- 或使用Ruby 2.x系列
然后,我想实际构建环境。
环境
作为前提,这次使用的环境如下。
- Windows 10专业版20H2 64位
- WSL 2 Ubuntu 20.04 LTS
- Docker 20.10.2版
- Ruby 3.0.0
- 辛纳屈2.1.0
- webrick 1.7.0
使用Docker Ruby 3.0.0构建Sinatra环境
Sinatra:我想按照README中描述的过程使用Docker构建环境。
从Ruby 3.0.0的映像启动容器
首先,启动Ruby容器。
1 | $ docker container run -it -d -p 4567:4567 --name sinatra_test ruby:latest |
添加了
-it -d选项以使Ruby容器在后台运行。
Sinatra默认使用端口号4567进行通信,因此使用-p将容器端口号4567分配给主机端口号4567。
这次我用--name命名了容器sinatra_test。
1 2 3 4 5 | Unable to find image 'ruby:latest' locally ~中略~ d4f1f93f0c61eb98d1007f2012e3d4d5225e9d3996e809c609be1ab6e1586169 |
让我们检查正在运行的容器。
1 | $ docker container ls |
1 2 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d4f1f93f0c61 ruby:latest "irb" 6 minutes ago Up 6 minutes 0.0.0.0:4567->4567/tcp sinatra_test |
Ruby容器已正确启动。
rb文件的执行
接下来,准备运行Sinatra的rb文件。
1 2 3 | $ mkdir sinatra_test $ cd sinatra_test ~/sinatra_test$ touch myapp.rb |
首先,创建一个工作目录。这次我选择了sinatra_test。转到您创建的sinatra_test目录,并创建一个名为myapp.rb的文件。
myapp.rb
1 2 3 4 5 | require 'sinatra' get '/' do 'Hello world!' end |
myapp.rb如上所述。
将
myapp.rb复制到容器中。
1 | ~/sinatra_test$ docker container cp myapp.rb sinatra_test:/ |
从这里开始,我们将在容器内工作。
1 | $ docker container exec -it sinatra_test bash |
1 | root@d4f1f93f0c61:/# |
我把它放在一个容器中。首先,让我们看看复制的myapp.rb是否存在。
1 | root@d4f1f93f0c61:/# ls |
1 | bin boot dev etc home lib lib64 media mnt myapp.rb opt proc root run sbin srv sys tmp usr var |
接下来,让我们检查一下ruby的版本。
1 | root@d4f1f93f0c61:/# ruby -v |
1 | ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux] |
安装Sinatra。
1 | root@d4f1f93f0c61:/# gem install sinatra |
1 2 3 4 5 6 | Fetching sinatra-2.1.0.gem ~中略~ Successfully installed sinatra-2.1.0 6 gems installed |
这应该通过运行myapp.rb启动Web应用程序。使用-o将??host设置为localhost。让我们运行它。
1 | root@d4f1f93f0c61:/# ruby myapp.rb -o 0.0.0.0 |
1 2 3 | /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1755:in `detect_rack_handler': Server handler (thin,puma,reel,HTTP,webrick) not found. (RuntimeError) from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/base.rb:1493:in `run!' from /usr/local/bundle/gems/sinatra-2.1.0/lib/sinatra/main.rb:45:in `block in <module:Sinatra>' |
我得到一个错误,它没有开始。它说找不到服务器处理程序(瘦,彪马,卷轴,HTTP,webrick)。
Ruby 3.0.0发行版具有以下描述。
从2.7起的其他显着变化
-
以下库已从标准附加库中删除。如果要在3.0或更高版本中使用它,请从rubygems使用它。
- sdbm
- 韦布里克
- 远程登录
- xmlrpc
服务器似乎没有启动,因为已删除了名为webrick的应用程序服务器的库,该库在Ruby 3.0.0中作为Ruby 2.7的标准配置而被附加。
安装webrick
Webrick被删除,您应该在rubygems中使用它,因此我将再次安装webrick。
1 | root@d4f1f93f0c61:/# gem install webrick |
1 2 3 | Fetching webrick-1.7.0.gem Successfully installed webrick-1.7.0 1 gem installed |
webrick已安装,因此让我们再次运行myapp.rb。
1 | root@d4f1f93f0c61:/# ruby myapp.rb -o 0.0.0.0 |
1 2 3 4 | [2021-01-28 14:04:00] INFO WEBrick 1.7.0 [2021-01-28 14:04:00] INFO ruby 3.0.0 (2020-12-25) [x86_64-linux] == Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick [2021-01-28 14:04:00] INFO WEBrick::HTTPServer#start: pid=36 port=4567 |
它安全启动。如果在此状态下访问http://本地主机:4567 /,将显示Hello world!。
对于Ruby 2.7.2
顺便说一下,R??uby 2.x系列标配了webrick,因此,如果在安装Sinatra后运行myapp.rb,服务器将启动。我会尝试的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $ docker container run -it -d -p 4567:4567 --name sinatra_test ruby:2.7.2 ~中略~ root@e66f1ebb8a85:/# ruby -v ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x86_64-linux] root@e66f1ebb8a85:/# gem install sinatra ~中略~ Successfully installed sinatra-2.1.0 6 gems installed root@e66f1ebb8a85:/# ruby myapp.rb -o 0.0.0.0 [2021-01-28 14:16:35] INFO WEBrick 1.6.0 [2021-01-28 14:16:35] INFO ruby 2.7.2 (2020-10-01) [x86_64-linux] == Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick [2021-01-28 14:16:35] INFO WEBrick::HTTPServer#start: pid=24 port=4567 |
除了容器图像是ruby之外,我执行了与以前相同的过程:2.7.2。安装Sinatra后,无需运行$ gem install webrick就可以运行myapp.rb,服务器将正常启动。
概括
这次,当使用Docker构建Sinatra环境时,由于ruby:最新发生了一个错误。正如我在构建Sinatra环境的开始时所写的那样,我认为您应该了解以下几点。
- Webrick已从Ruby 3.0.0中删除
- 执行需要薄,彪马,卷轴,HTTP,Webrick等应用程序服务器
- 如果要使用webrick,请从RubyGems安装
- 或使用Ruby 2.x系列
另外,我发现在基于网络上的信息构建环境时,最好准备尽可能多的版本,而不仅限于这种情况。
希望本文对您有所帮助。
参考网站
- Sinatra:README(日语)
- Ruby 3.0.0版本