如何为Ruby on Rails应用程序dockerize Slanger

Slanger是用Ruby编写的Pusher协议的开源服务器实现。

根据Slanger项目README.md,Slanger并不是为了在Rails中运行而devise的。

它不是为了在Rails或Sinatra应用程序中运行而devise的

将它与一个Ruby on Rails应用程序一起dockerize会很好。 将采取什么步骤来实现呢?

您可以在下面find详细的步骤。 为了供您参考,所有的代码都可以在GitHub仓库上find 。

configurationRedis容器

Slanger 取决于Redis 。 所以首先,你需要一个Redis容器来运行。

在您的docker-compose.yml中,添加(作为示例):

redis: image: redis:4.0-alpine 

Dockerize Slanger

为Slanger添加一个Dockerfile(例如Dockerfile-slanger)

 FROM ruby:2.3.3 RUN gem install slanger CMD slanger --app_key $APPKEY --secret $APPSECRET -r redis://$REDIS_HOST:$REDIS_PORT/$REDIS_DB 

更新你的docker-compose.yml

 slanger: build: context: . dockerfile: Dockerfile-slanger depends_on: - redis ports: - "8080:8080" env_file: - .env.slanger 

环境文件.env.slanger看起来像这样:

 APPKEY=application_key APPSECRET=the_secret_for_the_application REDIS_HOST=redis REDIS_PORT=6379 REDIS_DB=Slanger 

同样在你的docker-compose.yml中,为你的Rails应用程序的依赖列表添加slanger:

 web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db - slanger env_file: - .env 

使用推杆与Slanger交谈

现在,您需要将gem文件添加到gem文件中

 gem 'pusher' 

接下来,您需要在Rails应用程序中添加configurationSlanger,方法是添加文件config / initializers / pusher.rb

 Pusher.app_id='application_id' Pusher.key='application_key' Pusher.secret='the_secret_for_the_application' Pusher.host='slanger' Pusher.port=4567 Pusher.logger=Rails.logger 

而已。 现在你可以在Rails中使用Pusher通过Slanger API端口将消息发布到你的Slanger服务器的一个频道,并且还可以在JavaScript中使用Pusher来通过WebSocket订阅你的Slanger服务器的频道。 请看下面的例子。

轨道

 class MessageController < ApplicationController def subscribe puts 'Subscribed' end def publish message = search_params.require(:message) Pusher.trigger('MY_CHANNEL', 'AN_EVENT', message: message) puts 'Published' end private def search_params params.permit(:message) end end 

JavaScript的

 <script src="https://js.pusher.com/4.2/pusher.min.js"></script> <p>Have subscribed to a Slanger channel</p> <p>Listening via WebSocket...</p> <script type="text/javascript"> var pusher = new Pusher('application_key', { wsHost: "localhost", wsPort: "8080", wssPort: "8080", enabledTransports: ['ws', 'flash'] }); var channel = pusher.subscribe('MY_CHANNEL'); channel.bind('AN_EVENT', function(data) { console.log('data: ', data); }); Pusher.log = function(data) { console.log('\t\t', data); }; </script> 

用docker构build和运行

一切就绪之后,您可以构build泊坞窗图像,并使用docker组件运行您的应用程序:

 docker-compose build docker-compose up $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9e3996f55e7c helloslanger_web "bundle exec rails..." 13 seconds ago Up 10 seconds 0.0.0.0:3000->3000/tcp helloslanger_web_1 24c8b05f22a5 helloslanger_slanger "/bin/sh -c 'slang..." About an hour ago Up 13 seconds 0.0.0.0:8080->8080/tcp helloslanger_slanger_1 6baa9eec8c5a redis:4.0-alpine "docker-entrypoint..." 4 days ago Up 14 seconds 6379/tcp helloslanger_redis_1 46bc3498a5bf postgres "docker-entrypoint..." 4 days ago Up 14 seconds 5432/tcp helloslanger_db_1 

testing

现在打开订阅者的url:

 http://localhost:3000/message/subscribe 

并发布消息:

 http://localhost:3000/message/publish/Slanger%20is%20cool 

然后在用户的浏览器控制台中,您会看到:

 Pusher : Event recd : {"event":"AN_EVENT","data":{"message":"Slanger is cool"},"channel":"MY_CHANNEL"} data: {message: "Slanger is cool"} 

希望能帮助到你。

顺便说一下,如果您想了解如何使用docker撰写dockerize您的Rails应用程序,请参阅docker 撰写文档 。

Interesting Posts