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