LoginSignup
2
1

More than 3 years have passed since last update.

Bluemix NLTK,MeCab,Watson API のコンテナのビルド 忘備録

Last updated at Posted at 2017-02-18

IBM Watson API や Pythonベースの日本語の自然言語処理に必要なツールが入った IBMコンテナ(Dockerコンテナ)をビルドして、IBM Bluemix のリポジトリに登録して、再利用できる様にします。 開発環境用のコンテナですから、もちろんコンテナが継続して実行する工夫もします。

Dockerコンテナのビルド環境の構築

目的のDockerコンテナは、自己のPC環境でビルドして、Bluemix のコンテナのリポジトリーに登録していきます。ビルドする環境は Ubuntu Linux の Docker が便利ですから、最初に自己のPC環境に Vagrantで Ubuntu Linux が動作する環境を作ります。
ここでは Vagrant の環境を準備する方法は以下のリンクが参考になると思います。

Vagrant環境ができたら、Ubuntu Linux の仮装マシンを起動して、Docker.ioをインストールします。

次に、クラウド・ファウンドリーの cf コマンド と Bluemix の bx コマンドをインストールして、Bluemix のアカウントにログインします。 もちろん Bluemix のアカウント取得は必須です。これらの前提条件を整えるには、以下のリンクが参考になります。

Dockerfile の雛形の取得と編集

日本語処理のツールとしては、Pythonで作られたNLTKが便利なので、最新のPythonが実行できるコンテナを作っていきます。 Pythonの最新環境のDockerfileの雛形として、Dockerのオフィシャル・イメージを利用するので、以下のコマンドで、Vagrant の Ubuntu上で Dockerfile をクローンします。 この雛形には、Python 2.7系、3系のすべての雛形がありますが、今回は Python 2.7 を利用してます。

root@ubuntu-xenial:~/docker# git clone https://github.com/docker-library/python

Python 2.7 のディレクトリに移動して Dockerfile を編集します。

root@ubuntu-xenial:~/docker/python# ls
2.7  3.6                          Dockerfile-slim.template               README.md
3.3  Dockerfile-alpine.template   Dockerfile-windowsservercore.template  update.sh
3.4  Dockerfile-debian.template   generate-stackbrew-library.sh
3.5  Dockerfile-onbuild.template  LICENSE
root@ubuntu-xenial:~/docker/python# cd 2.7
root@ubuntu-xenial:~/docker/python/2.7# ls
alpine  Dockerfile  onbuild  slim  wheezy  windows

編集する箇所を以下にリストしますから、オリジナルのDockerfileに追加します。

Dockerfile
     1  FROM buildpack-deps:jessie
     2  ADD ./app /app
     3  
<中略>
    10  
    11  # runtime dependencies
    12  RUN apt-get update && apt-get -y upgrade && apt-get install -y --no-install-recommends \
    13          tcl \
    14          tk \
    15          mecab \
    16          libmecab-dev \
    17          mecab-ipadic \
    18          mecab-ipadic-utf8 \
    19          mecab-utils \
    20          emacs-nox \
    21          nmon \
    22      && rm -rf /var/lib/apt/lists/*

追加の箇所の説明を以下に列挙します。

  • 2行目 コンテナの終了を止めるシェルの入ったディレクトリで、この後に解説します。
  • 12行目 apg-get -y upgrade を追加します。Ubuntu 14.04 では OpenSSLに重大な脆弱性があり、対策としてアップグレードします。
  • 15行目〜19行目 形態素解析のための MeCab と辞書を追加します。
  • 20行目は ファイル編集のためのツールの追加です。 お好みで置き換えてください。
  • 21行目は OSの動作状況を表示するモニタリングツールの追加です。Dockerコンテナのホストマシンの動作状態を知ることができますから、反応が遅い時にホストマシンのCPU状態を知る事ができるので便利です。
Dockerfile
    77  RUN pip install --no-cache-dir mecab-python
    78  RUN pip install --no-cache-dir watson-developer-cloud
    79  RUN pip install --no-cache-dir BeautifulSoup
    80  RUN pip install --no-cache-dir nltk

続きの修正箇所を列挙します。

  • 77行目 MeCab の Python APIライブラリの追加です。
  • 78行目 WatsonAPI の Python ライブラリの追加です。
  • 79行目 ウェブスクレイビングのツールの追加です。
  • 80行目 自然言語ツールキットの追加です。
Dockerfile
    80  RUN pip install --no-cache-dir nltk
    81  
    82  CMD ["bash", "/app/loop_wait"]

最後に コンテナが終了しない様に、無限ループでsleepを実行するコマンドを実行します。

コンテナ継続実行のための工夫

前述の ADD ./app /app の解説です。 2.7のフォルダーに、appのディレクトリを作成して、以下のファイル作成して、実行権 chmod +x loop_waitを与えます。

loop_wait
#!/bin/bash
while true; do sleep 60; done

このファイルを Dockerfileの最終行 82行目の CMDから実行することで、コンテナを継続実行させます。

コンテナのビルドとBluemixリボジトリへの登録

自己のvagrantの環境で、コンテナをビルドします。 Dockerfile ファイルと app ディレクトリのある場所で、以下のコマンドを実行します。 必要なパッケージをコンテナにインストールして、ファイルを集めPython 2.7.13 をコンパイルして、コンテナをビルドします。このコンテナをビルドするのに10分くらい必要かもしれません。

root@ubuntu-xenial:~/python/2.7# docker build -t mynode:python .

ビルドが完了すると、以下の様なメッセージ出ますから、ビルドの成功を知る事ができます。

Step 9 : RUN pip install --no-cache-dir virtualenv
 ---> Running in 3259e634ff72
Collecting virtualenv
  Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
Installing collected packages: virtualenv
Successfully installed virtualenv-15.1.0
 ---> b95cc31c623c
Removing intermediate container 3259e634ff72
Step 10 : CMD python2
 ---> Running in 3fb0181e560c
 ---> 25903811171b
Removing intermediate container 3fb0181e560c
Successfully built 25903811171b

次に Bluemix のリポジトリの名前を取得します。 cf コマンドは、BluemixのベースとなっているクラウドファンドリーのCLIツールで、その後のicは、Dockerのプラグインを指すサブコマンドです。

root@ubuntu-xenial:~/docker/python/2.7# cf ic namespace get
takara_node

ローカルのコンテナに、Bluemix のリポジトリのタグを付けます。

root@ubuntu-xenial:~/docker/python/2.7# docker tag mynode:python registry.ng.bluemix.net/takara_node/python

次のコマンドで、Bluemix のリポジトリへ、ビルドしたコンテナを登録します。

root@ubuntu-xenial:~/docker/python/2.7# docker push registry.ng.bluemix.net/takara_node/python

次のコマンドでBluemixの登録された共通コンテナと自分の登録したコンテナをリスクする事ができます。最終行に、pythonコンテナが登録されている事が解ります。

root@ubuntu-xenial:~/docker/python/2.7# cf ic images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
registry.ng.bluemix.net/ibmnode               latest              acec21732cb5        11 days ago         192.5 MB
registry.ng.bluemix.net/ibmnode               v4                  acec21732cb5        11 days ago         192.5 MB
<中略>
registry.ng.bluemix.net/ibmliberty            webProfile7         6b2b8341fa32        5 weeks ago         276 MB
registry.ng.bluemix.net/takara_node/mynode1   latest              721caef84790        12 days ago         190.9 MB
registry.ng.bluemix.net/takara_node/python    latest              17f60ad04c10        2 hours ago         334.4 MB

この状態で、Bluemix ポータルでカタログを見ると、上記のコンテナが表示されているはずです。 右下に、紫色で python というコンテナが表示されています。
スクリーンショット 2017-02-18 10.42.43.png

コンテナの起動とログイン

ウェブのポータル画面からも実行できますが、次のCLIコマンドでもコンテナを開始できます。

root@ubuntu-xenial:~/python/2.7# cf ic run --name python -m 512 registry.ng.bluemix.net/takara_node/python:latest

初回はコンテナのビルドに約1分くらいかかります。ビルド中は以下のcf ic ps コマンドでビルド中であることを知る事ができます。

root@ubuntu-xenial:~/python/2.7# cf ic ps
CONTAINER ID        IMAGE                                                COMMAND             CREATED             STATUS                    PORTS                          NAMES
edd1f16c-625        registry.ng.bluemix.net/takara_node/python:latest    ""                  15 seconds ago      Building 14 seconds ago                                  python

この様子は、Bluemixポータルからも確認ができます。
コンテナのビルド中状態
スクリーンショット 2017-02-18 11.08.15.png

ビルド完了状態
スクリーンショット 2017-02-18 11.11.17.png

コンテナの詳細画面
スクリーンショット 2017-02-18 11.17.51.png

コンテナへのログイン

次のコマンドで、コンテナへログインして、シェルからコマンドを実行できる様になります。

root@ubuntu-xenial:~/docker/python/2.7# cf ic exec -it python /bin/bash
root@instance-003624a8:/# ps -ax                                                                                                                                
    PID TTY      STAT   TIME COMMAND
      1 ?        Ss     0:00 bash /app/loop_wait
     18 ?        Ss     0:00 /bin/bash
     24 ?        S      0:00 sleep 60
     25 ?        Ss     0:00 /bin/bash
     31 ?        R+     0:00 ps -ax

その他 Docker コマンド

コンテナの停止には、stop を利用します。

root@ubuntu-xenial:~/python/2.7# cf ic ps
CONTAINER ID        IMAGE                                                COMMAND             CREATED             STATUS                PORTS                          NAMES
cea800cf-862        registry.ng.bluemix.net/takara_node/python:latest    ""                  6 hours ago         Running 6 hours ago                                  python
26dba932-cc4        registry.ng.bluemix.net/takara_node/mynode1:latest   ""                  12 days ago         Running 12 days ago   169.46.19.213:3000->3000/tcp   mynode1
root@ubuntu-xenial:~/python/2.7# cf ic stop cea800cf-862
cea800cf-862

コンテナの削除するには、rm を利用します。

root@ubuntu-xenial:~/python/2.7# cf ic rm cea800cf-862
cea800cf-862

コンテナのイメージの削除には、rmi を利用します。

root@ubuntu-xenial:~/python/2.7# cf ic images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
<中略>
registry.ng.bluemix.net/takara_node/python    latest              8cd32e284563        7 hours ago         310.2 MB

root@ubuntu-xenial:~/python/2.7# cf ic rmi registry.ng.bluemix.net/takara_node/python 
Untagged: sha256:8cd32e2845639a3fad5bd6e26c7a57c3f69539cebbd846535bb99b634aa8b324

ローカル環境でビルドに利用したイメージを削除するには、dockerコマンドを利用します。

root@ubuntu-xenial:~# docker images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
mynode                                        python              8cd32e284563        7 hours ago         852 MB
registry.ng.bluemix.net/takara_node/python    latest              8cd32e284563        7 hours ago         852 MB

root@ubuntu-xenial:~# docker rmi mynode:python
Untagged: mynode:python

root@ubuntu-xenial:~# docker rmi registry.ng.bluemix.net/takara_node/python:latest

構築テスト

MeCabがインストールされている事の確認

root@instance-003624a8:/# mecab -v
mecab of 0.996

PythonのNLTKの導入確認

root@instance-003624a8:/# python
Python 2.7.13 (default, Feb 17 2017, 23:23:18) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import nltk
>>> nltk.download()
NLTK Downloader
---------------------------------------------------------------------------
    d) Download   l) List    u) Update   c) Config   h) Help   q) Quit
---------------------------------------------------------------------------
Downloader> 
2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1