我有一个运行Flask应用程序的Docker容器。当Flask收到并发出http请求时,我想触发一个新的临时Docker容器的执行,一旦完成其工作,该容器便会关闭。
我已阅读Docker-in-Docker,应避免在其主机上而不是在Flask容器中以兄弟容器的身份运行此新容器。
用docker-py执行此操作的解决方案是什么?
答案 0 :(得分:3)
我们正在通过在主机和容器之间挂载namespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
protected $table = 'tasks';
//
}
作为共享卷来进行此类操作。这允许容器将命令发送到机器,例如docker run
这是我们CI系统的一个示例:
docker.sock
答案 1 :(得分:0)
回答我自己的问题。这是一个完整的设置,可以正常工作。 在一个文件夹中,创建以下文件:
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一旦执行完毕,便要删除该容器。