実行環境
- Ubuntu-20.04.2
- Python 3.8.10
$ python3 -V
Python 3.8.10
- ライブラリ: docker-py
Docker Engine API用のPythonライブラリです。
DockerコンテナをPythonプログラムで操作する
Pythonにはdocker-pyというライブラリがあるためPythonプログラムを用いてdockerコンテナを操作できる。
インストール方法
pipを使用してインストールできる。
$ pip3 install docker
使用方法
実行するためdockerデーモンと通信する。
test.py
import docker
cli = docker.from_env()
試しにPythonのコンテナを立ててみる。
test.py
import docker
cli = docker.from_env()
cont_image = "python:3.9-alpine"
cont_run = cli.containers.run(image=cont_image, detach=True, tty=True, command=["/bin/sh"])
実行してみる。
$ sudo python3 test.py
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f968c5c3194 python:3.9-alpine "/bin/sh" About a minute ago Up About a minute recursing_chandrasekhar
無事Pythonプログラムを用いてコンテナを立てられた。
立てたコンテナでPythonプログラムを実行する
大まかな方法を説明すると、test.pyでtest2.pyの内容を読み取り、test2.pyの全文をコンテナに送ることによりプログラムをコンテナにコピーすることなく実行する。
コンテナ内で実行するPythonプログラムを用意する
試しにコンテナ内でFlaskというライブラリをインストールするプログラムを作成する。
test2.py
import subprocess
install_flask = subprocess.check_output(["pip", "install", "flask"]).decode('utf-8')
print(install_flask)
test2.pyをtest.pyで立てたコンテナで実行する
test2.pyを実行するプログラム作成
test.py
import docker
cli = docker.from_env()
cont_image = "python:3.9-alpine"
cont_run = cli.containers.run(image=cont_image, detach=True, tty=True, command=["/bin/sh"])
with open("./test2.py") as f:
code = f.read()
exec_run = cont_run.exec_run(["sh", "-c", f"cat<<EOF | python\n{code}\nEOF"]).output.decode("utf-8")
print(exec_run)
test.py実行結果
$ sudo python3 test.py
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Collecting flask
Downloading Flask-2.0.2-py3-none-any.whl (95 kB)
Collecting itsdangerous>=2.0
Downloading itsdangerous-2.0.1-py3-none-any.whl (18 kB)
Collecting Werkzeug>=2.0
Downloading Werkzeug-2.0.2-py3-none-any.whl (288 kB)
Collecting Jinja2>=3.0
Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB)
Collecting click>=7.1.2
Downloading click-8.0.3-py3-none-any.whl (97 kB)
Collecting MarkupSafe>=2.0
Downloading MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl (30 kB)
Installing collected packages: MarkupSafe, Werkzeug, Jinja2, itsdangerous, click, flask
Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.2 click-8.0.3 flask-2.0.2 itsdangerous-2.0.1
この方法を用いることでコンテナにファイルをコピーすることなくコンテナでPythonファイルを実行することができる。
最後に
docker-pyを使えるようになるとシェルスクリプトを使わずにdockerの操作を自動化できるので結構便利です!
皆さんぜひ使ってみてください!!