繁体   English   中英

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

[英]Run a docker container from an existing container using docker-py

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

我已经读过Docker-in-Docker应该避免使用,因此这个新容器应作为同级容器在我的主机上而不是在Flask容器内运行。

docker-py做到这一点的解决方案是什么?

我们通过将docker.sock作为主机和容器之间的共享卷挂载来进行类似的操作。 这允许容器将命令发送到机器,例如docker run

这是我们CI系统的一个示例:

 volumes:
 - /var/run/docker.sock:/var/run/docker.sock

回答我自己的问题。 这是一个完整的设置,可以正常工作。 在一个文件夹中,创建以下文件:

  • requirements.txt
  • Docker文件
  • docker-compose.yml
  • api.py

requirements.txt

docker==3.5.0
flask==1.0.2

Docker文件

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一旦执行完毕就将其删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM