运行 来自现有容器的 docker 容器,使用 docker-py
Run a docker container from an existing container using docker-py
我有一个 Docker 容器,其中 运行 是一个 Flask 应用程序。当 Flask 收到 http 请求时,我想触发一个 新的临时 Docker 容器 的执行,一旦它完成它必须做的事情就会关闭。
我读过 Docker-in-Docker should be avoided so this new container should be 运行 as a sibling container on我的主机,不在 Flask 容器内。
使用 docker-py 执行此操作的解决方案是什么?
我们正在通过将 docker.sock
安装为主机和容器之间的共享卷来做这样的事情。这允许容器向机器发送命令,例如 docker 运行
这是我们 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/
会触发alpine容器的执行。如果您还没有 alpine 图像,第一次会花费一些时间,因为 Docker 会自动下载图像。
参数 detach=True
允许异步执行容器,这样 Flask 就不会在返回响应之前等待进程结束。
参数 remove=True
指示 Docker 在容器执行完成后删除容器。
我有一个 Docker 容器,其中 运行 是一个 Flask 应用程序。当 Flask 收到 http 请求时,我想触发一个 新的临时 Docker 容器 的执行,一旦它完成它必须做的事情就会关闭。
我读过 Docker-in-Docker should be avoided so this new container should be 运行 as a sibling container on我的主机,不在 Flask 容器内。
使用 docker-py 执行此操作的解决方案是什么?
我们正在通过将 docker.sock
安装为主机和容器之间的共享卷来做这样的事情。这允许容器向机器发送命令,例如 docker 运行
这是我们 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/
会触发alpine容器的执行。如果您还没有 alpine 图像,第一次会花费一些时间,因为 Docker 会自动下载图像。
参数 detach=True
允许异步执行容器,这样 Flask 就不会在返回响应之前等待进程结束。
参数 remove=True
指示 Docker 在容器执行完成后删除容器。