« ◇Pythonで例外/引数解析/Zip/Base64 | トップページ | ◇∀象∃鼻 長い : 象は鼻が長い »

◇DockerにPython常駐プログラム

m(_ _)m 緊急メモ:書きかけです。

 Dockerで常駐型Pythonプログラム

Dockerのコンテナに次のPythonプログラムを入れ、実行します。

#!/usr/bin/python3
import time
def main():
   _n:int=0;
   while True:
      _n = _n+1
      print("hello world "+str(_n))
      time.sleep(2)
if __name__ == "__main__":
   main()

単純な無限ループになっており、2秒毎に"hello world カウント"表示をします。

Dockerの設定として、次のDockerfileを用います。

FROM ubuntu:20.04

RUN apt-get -y install python3

COPY ./hello.py /hello.py
ENTRYPOINT [ "/hello.py" ]

基本OSとしてubuntuを使い、python3をインストールしています。
ここでFROMはDockerHUB(基本イメージなどが置かれている)からubuntu:20.04のイメージを取り込むことを示しています。
COPYはソースに置いてあるhello.pyをDockerコンテナ内の/フォルダにコピーしています。
注意!:hello.pyには実行フラグを立てておく必要があります。
ENTRYPOINTはコピーされた/hellp.py起動ポイントであると宣言しています。

フォルダ構成は次のようになっています。
my_imageフォルダにPythonプログラムとDockerfileを置いてあります。
.shは手続きをスクリプトとしたものです。メモと思っても構いません。

$ tree
.
.
|-- my_image
|   |-- Dockerfile
|   `-- hello.py
`-- shell_set
    |-- A00_configure.sh
    |-- A01_buildImage.sh
    |-- A02_createContainer.sh
    |-- A03_startConatiner.sh
    |-- A04_stopContainer.sh
    |-- A05_rmContainer.sh
    |-- A11_exec.sh
    |-- AXX_installDocker.sh
    |-- B01_startBG.sh
    |-- B02_runImage.sh
    `-- B99_clean.sh

 手続き(非バックグラウンド実行)

Dockerでimageからコンテナを作り実行するまでの手続きを載せます。
それぞれ1行の単純な手続きですが、メモを兼ねたシェルスクリプトも作成してあります。

 Dockerのインストール

Dockerのインストール手順の例を挙げます。他の方法もとれますが、snapを使ったインストールを行うとdocker buildで
 lstat /var/lib/snapd/void/Dockerfile: no such file or directory
という訳の分からないエラーが発生します。対処法は不明です。

$ sudo apt install docker.io
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
-------
#AXX_installDocker.sh
#!/bin/bash
# UTF-8 LF
sudo apt install docker.io
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

途中の長いコマンドの行を折ったものを載せます。

sudo curl -L \
"https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)"\
 -o /usr/local/bin/docker-compose

 imageのビルド

my_image/フォルダに置いたプログラム(hello.py)と設定(Dockerfile)でimageと呼ばれるものを作ります。

$ sudo docker build -t my_image:v1 ./my_image
-------
#A01_buildImage.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker build -t ${IMAGE}:${TAG} ./${IMAGE}
sudo docker build -t ${IMAGE}:${TAG} ./${IMAGE}
if [ $? -ne 0  ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"
--
#A00_configure.sh
#!/bin/bash
# UTF-8 LF
BASE_DIR=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
IMAGE=my_image
TAG=v1
CONTAINER=my_container

 コンテナの生成

作成したイメージからコンテナを名前付きで生成します。
-itオプションはstartで対話モードが可能となる指定です。

$ sudo docker container create -it --name my_container my_image:v1
-------
#A02_createContainer.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker container create -it --name ${CONTAINER} ${IMAGE}:${TAG}
sudo docker container create -it --name ${CONTAINER} ${IMAGE}:${TAG}
if [ $? -ne 0  ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"

 コンテナの対話モードstart

コンテナを対話モードでstartさせます。-aは対話モード指定です。対話モードでstartさせるのは標準出力を確認するためです。
最終的には非対話モードでstartまたはrunさせます。

$ sudo docker container start -a my_container
-------
#A03_startConatiner.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker container start -a ${CONTAINER}
sudo docker container start -a ${CONTAINER}
if [ $? -ne 0  ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi

 コンテナのstop

対話モードでも必ずしもint割り込みで停止できるとは限りません。次のコマンドで停止させることができます。停止まで10秒程かかります。

$ sudo docker stop my_container
-------
#A04_stopContainer.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker stop ${CONTAINER}
sudo docker stop ${CONTAINER}
if [ $? -ne 0  ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"

 コンテナの削除

コンテナは次のようにして削除します。

$ echo sudo docker rm my_container
-------
#A05_rmContainer.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker rm ${CONTAINER}
sudo docker rm ${CONTAINER}
if [ $? -ne 0  ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi
echo "DONE"

 バックグラウンド実行

 コンテナのバックグラウンドstart

start時にオプションを付けなければバックグラウンド実行となります。

$ sudo docker container start my_container
-------
#B01_startBG.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker container start ${CONTAINER}
sudo docker container start ${CONTAINER}
if [ $? -ne 0  ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi

 imageのrun

コンテナを作成する手順を踏まずimageを指定してrunさせることができます。

こちらの手順がstart手順よりオプション指定も多く、一般的です。

run手順でコンテナが作成されるため、コンテナの取り扱いで混乱が生じることが多いようです。

$ sudo docker container run -b my_image:v1
-------
#B02_runImage.sh
#!/bin/bash
# UTF-8 LF
# バックグラウンド実行
source ./A00_configure.sh
echo sudo docker container run -d ${IMAGE}:${TAG}
sudo docker container run -d ${IMAGE}:${TAG}

実行すると、コンテナのIDが表示されます。このIDを記録しておく必要があります。
Dockerのシェルを動かすことやその他でこのIDが必要となります。

$ ./B02_runImage.sh
947bfef7804c5b5f56538191ac5c8529a7ce5ee20e8a280d5d062da96d3bd872

 Dockerシェル(コンテナ内シェル)

コンテナ内はホストPCとは別環境となっています。

例えばコンテナ内でlsやpsを実行するにはコンテナを指定しDocker execを実行し、シェル環境に入ります。

startでコンテナを指定してある場合はそのコンテナ名を指定してexecを実行します。

$ ./B01_startBG.sh
my_container
$ sudo docker exec -it my_container /bin/bash
root@1cb17c9a7157:/# ls
bin  boot  dev  etc  hello.py  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@1cb17c9a7157:/# ps
    PID TTY          TIME CMD
      8 pts/1    00:00:00 bash
     17 pts/1    00:00:00 ps
root@1cb17c9a7157:/#
-------
#A11_exec.sh
#!/bin/bash
# UTF-8 LF
source ./A00_configure.sh
echo sudo docker exec -it ${CONTAINER} /bin/bash
sudo docker exec -it ${CONTAINER} /bin/bash
if [ $? -ne 0  ]; then echo "*** SOME ERROR OCCURED ***";exit 1; fi

runでコンテナを指定せず起動した場合は、出力されたコンテナID(先頭12文字以上)を指定します。

$ ./B02_runImage.sh
947bfef7804c5b5f56538191ac5c8529a7ce5ee20e8a280d5d062da96d3bd872
$ sudo docker exec -it 947bfef7804c /bin/bash
root@947bfef7804c:/# ls
bin  boot  dev  etc  hello.py  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@947bfef7804c:/# ps
    PID TTY          TIME CMD
     14 pts/0    00:00:00 bash
     24 pts/0    00:00:00 ps
root@947bfef7804c:/#exit

 ゴミ処理

runを使う場合、毎回新たなコンテナが作成されますので、システムはゴミだらけになります。次の手順で使用しなくなってた資源を開放できます。

$ sudo docker system prune -a
-------
#B99_clean.sh
#!/bin/bash
# UTF-8 LF
echo sudo docker system prune -a
sudo docker system prune -a

 ダウンロード

ファイルはhellopython.tar.gzからダウンロードできます。

|

« ◇Pythonで例外/引数解析/Zip/Base64 | トップページ | ◇∀象∃鼻 長い : 象は鼻が長い »