3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-pyを用いてDockerコンテナ内で外部ファイルを実行する方法

Last updated at Posted at 2021-11-18

実行環境

  • 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の操作を自動化できるので結構便利です!
皆さんぜひ使ってみてください!!

3
0
0

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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?