使用 Slack 机器人开始使用 Docker
太长不看
-
- Slack bot + Redisの環境をローカルに構築するのは大変><
-
- RedisをコンテナにしたらどのOSでも一発で動かせる!
-
- Slack botもコンテナにしたらRedisコンテナとの連携も簡単!
- Docker Composeを使えばBotとRedisを1つのコマンドだけで起動できるよ
让Slack机器人在Docker容器上运行。
在Slack等平台上运行的机器人,例如Hubot或Ruboty,通常使用Redis等键值数据库来实现数据永久化。
这次我们尝试在Docker容器上运行这个Slack bot(Ruboty)+ Redis。
Redis容器
关于Redis,官方提供了容器,通过使用它,无需在本地环境安装Redis,只需进行docker pull和docker run就能让Redis在任何环境下运行起来。
$ docker run -p 6379:6379 -v /srv/docker/redis:/var/lib/redis redis:latest
机器人容器
基础图像
在这个例子中,由于使用Ruboty来实现机器人,所以基于Ruby环境来构建。
FROM ruby:2.2.4
工作目录
接下来,随意创建一个工作目录并进行移动。
ENV PROJECT /ruboty
RUN mkdir $PROJECT
WORKDIR $PROJECT
依赖关系
接下来,只需添加Gemfile和Gemfile.lock(如果是Node.js,则需要添加package.json)并解决依赖关系。之所以先移动这两个文件,是出于与”使用Docker快速执行bundle install”一文相同的原因。
ADD Gemfile $PROJECT
ADD Gemfile.lock $PROJECT
RUN bundle install
跑!
最後に,プロジェクト全体をコンテナに移してbotを起動する.
ADD . $PROJECT
CMD ["ruboty", "--dotenv"]
基本上是这样的顺序。 shì de .)
仅需要一种翻译选项:补全
native extensionに依存したGemなど利用する場合は適宜apt-get等でいい感じにしておく.
書く場所はたぶんGemfileまわりのことを処理する直前がいい.
示例
FROM ruby:2.2.4
ENV PROJECT /ruboty
RUN mkdir $PROJECT
WORKDIR $PROJECT
# RUN apt-get update && \
# apt-get -y --no-install-recommends install <native_extensions>
ADD Gemfile $PROJECT
ADD Gemfile.lock $PROJECT
RUN bundle install
ADD . $PROJECT
CMD ["ruboty", "--dotenv"]
コンテナの起動・連携
Redis容器
你想要设定的主要是以下三个选项吗?
-
- 名前
-
- ポート番号
-
- Data Volumeの設定
データを永続化させたいんやろ?
$ docker run -d --name redis -p 6379:6379 -v /srv/docker/redis:/var/lib/redis redis
机器人容器
虽然启动选项不像Redis那么多,但在Ruboty中仍需要传递Redis的URL。因此需要使用–link选项。
$ docker run -d --name ruboty --link redis
另外,给予Ruboty一个如下的.env文件(其他必要的环境变量可以先写在这里,之后根据需要进行适当调整)。
REDIS_URL="redis://${REDIS_PORT_6379_TCP_ADDR}:${REDIS_PORT_6379_TCP_PORT}"
RUBOTY_ENV=production
这样可以很好地协作了。
使用Docker Compose可以方便地启动。
目前为止,我已在Docker容器上成功完成了一个能够运行并持久化数据的机器人。但是,存在一个严重的问题:启动命令非常冗长,而且需要输入两个命令才能正常运行。
$ docker run -d --name redis -p 6379:6379 -v /srv/docker/redis:/var/lib/redis redis
$ docker run -d --name ruboty --link redis
为了解决这个问题,可以使用Docker Compose。Docker Compose可以将容器的配置和选项等信息整合到一个名为docker-compose.yml的文件中。
ruboty:
build: .
links:
- redis
command: ruboty --dotenv --load ./lib/ruboty/trello_reporter.rb
redis:
image: hypriot/rpi-redis
ports:
- 6379:6379
volumes:
- /srv/docker/redis:/data
restart: always
仅需一次命令即可启动!
$ docker-compose up
概要
我介绍了一个在Slack等平台上使用的bot的例子,通过引入Docker来实现更轻松的构建和管理。
在本地构建Slack bot + Redis的环境很困难><
把Redis放入容器中,就可以在任何操作系统上一次启动!
把Slack bot也放入容器中,与Redis容器的配合也很简单!
使用Docker Compose,只需一个命令即可启动Bot和Redis。
如果是个人操作的机器人的话,我觉得相对于使用Docker容器处理Web应用程序,采用这种方式也可以更轻松地进行引入。所以,对于对Docker不太了解或害怕的人来说,试试这种方法怎么样?