如何触发容器启动另一个容器并在将 REST 查询传递给它时终止它?

How to trigger a container to start another container and terminate it when a REST query is passed to it?

我有两个单独的容器,其中有 docker 个图像,其中一个是 运行 REST 应用程序,另一个是 运行 下载卫星图像的过程。 我的目标是当我在我的主应用程序中通过定义的参数传递查询后单击下载按钮时,它应该启动容器进行下载,一旦下载,它应该停止容器。目前,我可以 运行 通过在其部署文件中为它的 docker 图像提供所有必要的环境变量来独立下载容器,但从长远来看 运行 这些变量应该作为来自 query.How 的参数我可以做到这一点吗? 这是 运行ning 镜像所需的当前部署文件和参数:

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: back
spec:
  replicas: 1
  selector:
    matchLabels:
      app: back
  template:
    metadata:
      creationTimestamp: 
      labels:
        app: back
    spec:
      containers:
      - name: back
        image: back:latest
        imagePullPolicy: Never
        env:
        - name: scihub_username
          value: test
        - name: scihub_password
          value: test
        - name: CDINRW_BASE_URL
          value: 10.1.40.11:8081/swagger-ui.html
        - name: CDINRW_JOB_ID
          value: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        ports:
        - containerPort: 8081
          protocol: TCP
        volumeMounts:
        - mountPath: /data
          name: test-volume
      volumes:
      - name: test-volume
        hostPath:
          # directory location on host
          path: /back
          # this field is optional
          type: Directory
docker run --rm -v $(pwd):/out_data \
-e scihub_username=test \
-e scihub_password=test \
-e producttype=S2MSI2A \
-e platformname=Sentinel-2 \
-e start_date=2019-06-09T00:00:00.000Z \
-e end_date=2019-06-12T00:00:00.000Z \
-e days_back=7 \
-e footprint="POLYGON((5.8664000 50.3276000,9.4623000 50.3276000,9.4623000 52.5325000,5.8664000 52.5325000,5.8664000 50.3276000))" \
-e max_cloud_cover_percentage=10 \
-e CDINRW_BASE_URL=10.1.40.11:8081/swagger-ui.html \
-e CDINRW_JOB_ID=3fa85f64-5717-4562-b3fc-2c963f66afa6 \
ingestion

对于这样的工作负载,更好的设计是部署一个像 RabbitMQ 这样的作业队列系统,并有两个 long-运行ning 容器(部署,因为你使用的是 Kubernetes)。其中之一 运行 是 REST 服务器,当它收到请求时,将请求的详细信息写入队列。第二个监听队列,一次拉取一条消息,并进行网络获取。

特别是在 Kubernetes 中,这种方法有几个优点。您可以轻松构建和测试它,而无需 Docker 或 Kubernetes。如果您被请求淹没,它们会在作业队列中备份,而不是启动数十个或数百个容器。如果您发现队列很长并且想更快地进行提取,您可以 kubectl scale deployment 非常轻松地 运行 更多工作人员。

如果你不想采用那种方法,你应该使用 Kubernetes API 创建一个 Job,它可以在失败时重新启动,而不是紧密绑定到同一个节点,并且不需要主机上的根级别权限即可启动。基本上,你不应该从 Kubernetes pod 内部发出 运行 docker 命令。 (并且由于 运行ning docker 命令增加了对整个主机进行 root 的可能性,因此在任何情况下您都需要非常非常小心地从 Web 服务器执行此操作。)