使用docker-py从现有容器运行Docker容器

时间:2018-08-12 14:13:58

标签: python docker flask dockerpy docker-in-docker

我有一个运行Flask应用程序的Docker容器。当Flask收到并发出http请求时,我想触发一个新的临时Docker容器的执行,一旦完成其工作,该容器便会关闭。

我已阅读Docker-in-Docker,应避免在其主机上而不是在Flask容器中以兄弟容器的身份运行此新容器。

docker-py执行此操作的解决方案是什么?

2 个答案:

答案 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
  • Dockerfile
  • docker-compose.yml
  • api.py

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一旦执行完毕,便要删除该容器。