Ale*_*and 6 python flask docker dockerpy docker-in-docker
我有一个运行 Flask 应用程序的 Docker 容器。当 Flask 接收到 http 请求时,我想触发一个新的临时 Docker 容器的执行,该容器一旦完成它必须做的事情就会关闭。
我读过应该避免使用 Docker-in-Docker,因此这个新容器应该作为同级容器在我的主机上运行,而不是在 Flask 容器内运行。
使用docker-py执行此操作的解决方案是什么?
gCo*_*Coh 10
docker.sock我们正在通过在主机和容器之间安装为共享卷来完成类似的事情。这允许容器向机器发送命令,例如 docker run
这是我们 CI 系统的一个示例:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
回答我自己的问题。这是一个有效的完整设置。在一个文件夹中,创建以下文件:
要求.txt
docker==3.5.0
flask==1.0.2
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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!"
Run Code Online (Sandbox Code Playgroud)
然后打开浏览器并导航至http://0.0.0.0:5000/
它将触发 alpine 容器的执行。如果您还没有 alpine 镜像,那么第一次会花费一些时间,因为 Docker 会自动下载镜像。
论点detach=True允许异步执行容器,以便 Flask 在返回其响应之前不会等待进程结束。
该参数remove=True指示 Docker 在执行完成后删除容器。
| 归档时间: |
|
| 查看次数: |
2660 次 |
| 最近记录: |