[英]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==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.