Flaskアプリケーションを実行するDockerコンテナがあります。Flaskがhttpリクエストを受信したら、新しいエフェメラルDockerコンテナの実行をトリガーしたいと思います。このコンテナは、実行する必要がある処理が完了するとシャットダウンします。
Docker-in-Dockerは避けるべきだと読んだので、この新しいコンテナーは、Flaskコンテナー内ではなく、ホスト上で兄弟コンテナーとして実行する必要があります。
docker-pyでこれを行うための解決策は何でしょうか?
私自身の質問に答えます。これが機能する完全なセットアップです。1つのフォルダーに、次のファイルを作成します。
Requirements.txt
docker==3.5.0
flask==1.0.2
Dockerfile
FROM python:3.7-alpine3.7
# Project files
ARG PROJECT_DIR=/srv/api
RUN mkdir -p $PROJECT_DIR
WORKDIR $PROJECT_DIR
COPY requirements.txt ./
# Install Python dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
docker-compose.yml
上記の前の回答で述べたように、docker.sockをボリュームにマウントしてください。
version: '3'
services:
api:
container_name: test
restart: always
image: test
build:
context: ./
volumes:
- ./:/srv/api/
- /var/run/docker.sock:/var/run/docker.sock
environment:
FLASK_APP: api.py
command: ["flask", "run", "--host=0.0.0.0"]
ports:
- 5000:5000
api.py
from flask import Flask
import docker
app = Flask(__name__)
@app.route("/")
def hello():
client = docker.from_env()
client.containers.run('alpine', 'echo hello world', detach=True, remove=True)
return "Hello World!"
次に、ブラウザを開いてに移動します http://0.0.0.0:5000/
アルパインコンテナの実行をトリガーします。高山の画像をまだお持ちでない場合は、Dockerが画像を自動的にダウンロードするため、最初は少し時間がかかります。
引数をdetach=True
使用すると、コンテナーを非同期で実行できるため、Flaskはプロセスの終了を待たずに応答を返します。
引数remove=True
は、Dockerが実行が完了したらコンテナーを削除することを示します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加