簡體   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