Build an IBM container (Docker container) that contains the tools required for IBM Watson API and Python-based Japanese natural language processing, and register it in the IBM Bluemix repository so that it can be reused. Since it is a container for the development environment, of course, we will devise ways to keep the container running.
Build the target Docker container in your own PC environment and register it in the Bluemix container repository. Since Docker of Ubuntu Linux is convenient as the environment to build, first create an environment where Ubuntu Linux runs with Vagrant in your own PC environment. Here, I think the following link will be helpful for how to prepare the environment of Vagrant.
Once you have a Vagrant environment, boot the Ubuntu Linux fake machine and install Docker.io.
Then install the Cloud Foundry cf command and the Bluemix bx command to log in to your Bluemix account. Of course, getting a Bluemix account is a must. The following links will help you to meet these prerequisites.
As a Japanese processing tool, NLTK made in Python is convenient, so we will create a container that can execute the latest Python. Since the official image of Docker is used as a template of Dockerfile in the latest environment of Python, clone the Dockerfile on Ubuntu of Vagrant with the following command. There are all Python 2.7 series and 3 series templates in this template, but this time I am using Python 2.7.
root@ubuntu-xenial:~/docker# git clone https://github.com/docker-library/python
Go to the Python 2.7 directory and edit the 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
The part to be edited is listed below, so add it to the original Dockerfile.
1 FROM buildpack-deps:jessie
2 ADD ./app /app
3
<Omitted>
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/*
The explanation of the additional parts is listed below.
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
I will list the following corrections.
80 RUN pip install --no-cache-dir nltk
81
82 CMD ["bash", "/app/loop_wait"]
Finally, execute the command to execute sleep in an infinite loop so that the container does not end.
A description of ADD ./app / app above. Create the app directory in the 2.7 folder, create the following files, and give the execution right chmod + x loop_wait.
!/bin/bash
while true; do sleep 60; done
By executing this file from the CMD on the last line 82 of the Dockerfile, the container will continue to run.
Build the container in your vagrant environment. Run the following command in the location of the Dockerfile file and the app directory. Install the required packages in the container, collect the files, compile Python 2.7.13, and build the container. It may take up to 10 minutes to build this container.
root@ubuntu-xenial:~/python/2.7# docker build -t mynode:python .
When the build is completed, the following message will be displayed, so you can know the success of the build.
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
Then get the name of the Bluemix repository. The cf command is the Cloud Foundry CLI tool on which Bluemix is based, and the subsequent ic is a subcommand that points to the Docker plugin.
root@ubuntu-xenial:~/docker/python/2.7# cf ic namespace get
takara_node
Tag your local container with your Bluemix repository.
root@ubuntu-xenial:~/docker/python/2.7# docker tag mynode:python registry.ng.bluemix.net/takara_node/python
Register the built container in the Bluemix repository with the following command.
root@ubuntu-xenial:~/docker/python/2.7# docker push registry.ng.bluemix.net/takara_node/python
You can risk Bluemix's registered common container and your own registered container with the following command. You can see that the python container is registered in the last line.
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
<Omitted>
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
In this state, if you look at the catalog in the Bluemix portal, you should see the above container. At the bottom right, you'll see a purple container called python.
You can also start the container from the portal screen of the web, but you can also start the container with the following CLI command.
root@ubuntu-xenial:~/python/2.7# cf ic run --name python -m 512 registry.ng.bluemix.net/takara_node/python:latest
The first time it takes about 1 minute to build the container. During the build, you can know that the build is in progress with the following cf ic ps command.
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
You can also check this from the Bluemix portal. Container building state
Build complete status
Container details screen
The following command will allow you to log in to the container and execute commands from the shell.
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
Use stop to stop the container.
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
Use rm to delete the container.
root@ubuntu-xenial:~/python/2.7# cf ic rm cea800cf-862
cea800cf-862
Use rmi to delete the image of the container.
root@ubuntu-xenial:~/python/2.7# cf ic images
REPOSITORY TAG IMAGE ID CREATED SIZE
<Omitted>
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
To delete the image used for the build in the local environment, use the docker command.
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
Confirm that MeCab is installed
root@instance-003624a8:/# mecab -v
mecab of 0.996
Confirmation of introduction of NLTK of Python
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>