Python Keras, NLTK, dan Pandas Dalam Docker Container

Tips membungkus aplikasi ke dalam Docker Container

Mahendra Data
3 min readMar 17, 2019

Beberapa waktu lalu, istri saya meminta bantuan saya untuk menjalankan program python yang dia buat di server. Alasannya sederhana, karena program tersebut memerlukan waktu lebih dari 12 jam untuk dapat selesai. Awalnya saya kira hal itu akan mudah, tapi begitu melihat requirement yang diberikan, saya langsung mengernyitkan dahi:

  • Python 3.5
  • Keras
  • NLTK
  • Pandas
  • Matplotlib
  • Scikit-learn

Masalah pertama adalah versi Python yang digunakan berbeda dengan server. Saya sudah membayangkan berbagai kerumitan bila harus mengubah atau menambah versi Python di server. Belum lagi berbagai library yang menjadi dependencies program buatan istri saya tersebut. Akhirnya saya putuskan untuk menggunakan Docker.

Awalnya saya berpikir akan mudah bila saya menggunakan Docker, tapi ternyata malah muncul masalah lain, yaitu bagaimana membuat Docker Image yang berisi seluruh requirement program istri saya tersebut. Saya sudah mencoba berbagai cara, yaitu:

  • Menggunakan image python 3.5 dan menginstall dependencies mengunakan PIP, tapi gagal karena terjadi error saat instalasi Keras menggunakan PIP;
  • Menggunakan image python 3.5 dan menginstall dependencies menggunakan virtualenv, tapi ternyata gagal juga saat instalasi Keras menggunakan PIP dalam virtualenv;

Akhirnya saya memutuskan menggunakan image anaconda. Docker image anaconda yang saya gunakan adalah continuumio/miniconda3 karena image anaconda tersebut cukup kecil, sekitar 460 MB. Kemudian saya membuat Dockerfile dengan isi:

FROM continuumio/miniconda3
RUN conda create -n env python=3.5
RUN conda install -c anaconda pyqt
RUN conda install -c anaconda scikit-learn
RUN conda install -c anaconda nltk
RUN conda install -c anaconda pandas
RUN conda install -c anaconda keras
RUN conda install -c anaconda matplotlib
RUN python -m nltk.downloader all
RUN echo 'source activate env' > ~/.bashrc
ENV PATH /opt/conda/envs/env/bin:$PATH

Kemudian saya build menjadi sebuah Docker Image. Namun aplikasi istri saya masih error saat dijalankan. Usut punya usut, ternyata library keras dll. yang telah saya install tersebut ter-install di luar anaconda environment env yang menggunakan Python 3.5. Masalahnya adalah, versi Python di dalam Docker Image continuumio/miniconda3 adalah Python 3.7, sehingga saya harus mencari cara agar dapat memasang library tersebut di dalam environment env.

Akhirnya setelah Googling berbagai macam sumber, mulai dari yang mencerahkan hingga yang menyesatkan, akhirnya saya menemukan cara yang tepat. Berikut ini adalah Dockerfile yang tepat untuk kasus yang saya hadapi.

Gambar 1. Dockerfile

Untuk memudahkan, berikut saya rangkum langkah-langkah yang perlu anda lakukan bila ingin membuat Docker Image seperti kasus yang saya hadapi.

Instalasi Docker

Lakukan instalasi Docker sesuai dengan jenis server Anda. Bila server anda Ubuntu 18.04, maka anda bisa menggunakan tutorial berikut ini.

Membuat Docker Image

Buatlah sebuah folder, misalnya dengan perintah

$ mkdir ~/docker_keras

Masukkan ke dalam folder tersebut

$ cd ~/docker_keras

Buatlah Dockerfile dengan isi sesuai dengan Gambar 1. Atau lebih mudah bisa anda download dengan perintah

$ wget https://gist.githubusercontent.com/datanduth/d98121ee9a0e64715c1603b97ace825c/raw/47e01a644154a138270db72a5671569990238909/Dockerfile

Kemudian build menggunakan perintah

$ sudo docker build -t keras:latest .

Proses build tersebut memakan waktu cukup lama, tergantung pada kecepatan internet dan server kita. Bila sudah selesai maka anda akan menemukan sebuah Docker Image dengan tag keras:latest ketika menjalankan perintah

$ sudo docker images

Menjalankan Program

Misalkan path program anda adalah /home/budi/programku/run.py maka anda bisa menjalankannya dengan perintah

# sudo docker run --mount type=bind,source=/home/budi/programku,target=/programku keras:latest python /programku/run.py

dan voila, program dengan penuh dependencies tersebut akan berhasil dijalankan.

--

--

Mahendra Data

Lecturer at Faculty of Computer Science, Universitas Brawijaya • System Administrator • https://www.linkedin.com/in/mahendra-data/