Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用docker py从现有容器运行docker容器_Python_Docker_Flask_Dockerpy_Docker In Docker - Fatal编程技术网

Python 使用docker py从现有容器运行docker容器

Python 使用docker py从现有容器运行docker容器,python,docker,flask,dockerpy,docker-in-docker,Python,Docker,Flask,Dockerpy,Docker In Docker,我有一个Docker容器,它运行一个Flask应用程序。当Flask接收到http请求时,我想触发一个新的临时Docker容器的执行,该容器一旦完成它必须做的事情就会关闭 我已经阅读了Docker中的Docker,应避免使用Docker,因此此新容器应作为主机上的同级容器运行,而不是在Flask容器中运行 解决方案是什么?我们通过在主机和容器之间安装docker.sock作为共享卷来实现这一点。这允许容器向机器发送命令,例如docker run 这是我们的CI系统的一个示例: volumes:

我有一个Docker容器,它运行一个Flask应用程序。当Flask接收到http请求时,我想触发一个新的临时Docker容器的执行,该容器一旦完成它必须做的事情就会关闭

我已经阅读了Docker中的Docker,应避免使用Docker,因此此新容器应作为主机上的同级容器运行,而不是在Flask容器中运行


解决方案是什么?

我们通过在主机和容器之间安装
docker.sock
作为共享卷来实现这一点。这允许容器向机器发送命令,例如docker run

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

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

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

  • 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/

它将触发alpine容器的执行。如果你还没有阿尔卑斯山的图片,第一次需要一点时间,因为Docker会自动下载图片

参数
detach=True
允许异步执行容器,以便Flask在返回响应之前不会等待进程结束


参数
remove=True
指示Docker在容器执行完成后移除容器。

您已经尝试了什么?对于您可以共享的主服务,您是否有一些示例代码和类似于
docker compose.yml
docker run
命令的东西?我还没有尝试过任何东西,因为我不确定如何开始。我将根据我的想法更新我的答案。我确实读到了这一点,但在我的烧瓶容器中安装docker套接字是否足以运行具有docker py的兄弟容器?是的,使用此选项,您可以像在主机上一样控制docker(…请记住,您可以像任何其他可以运行docker命令的用户一样控制主机。)