如何触发容器启动另一个容器并在将 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 服务器执行此操作。)
我有两个单独的容器,其中有 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 服务器执行此操作。)