假设我们有一个简单的 deployment.yml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: ikg-api-demo
name: ikg-api-demo
spec:
selector:
matchLabels:
app: ikg-api-demo
replicas: 3
template:
metadata:
labels:
app: ikg-api-demo
spec:
containers:
- name: ikg-api-demo
imagePullPolicy: Always
image: example.com/main_api:private_key
ports:
- containerPort: 80
问题是这个图像/容器依赖于另一个图像/容器 - 它需要从另一个图像中获取数据,或者使用一些共享卷。
如何告诉 kubernetes 下载另一个镜像,将其作为容器运行,然后将数据从中复制到上述文件中声明的容器中?
看起来这篇文章解释了如何。
但目前还不是 100% 清楚它是如何工作的。看起来您创建了一些共享卷,启动两个容器,使用该共享卷?
所以我根据那个链接,我把它添加到我的deployment.yml中:
spec:
volumes:
- name: shared-data
emptyDir: {}
containers:
- name: ikg-api-demo
imagePullPolicy: Always
volumeMounts:
- name: shared-data
mountPath: /nltk_data
image: example.com/nltk_data:latest
- name: ikg-api-demo
imagePullPolicy: Always
volumeMounts:
- name: shared-data
mountPath: /nltk_data
image: example.com/main_api:private_key
ports:
- containerPort: 80
我的主要犹豫是,将 /nltk_data 安装为共享卷将覆盖可能已经存在的内容。
所以我假设我需要做的是将它安装在其他位置,然后为源数据容器创建 ENTRYPOINT:
ENTRYPOINT ['cp', '-r', '/nltk_data_source', '/nltk_data']
这样一旦容器启动,就会将其写入共享卷。
所以我有两个问题:
如何在另一个容器开始使用 kubernetes 之前运行一个容器并完成一项工作?
如何写入共享卷而不让共享卷覆盖映像中的内容?换句话说,如果我在图像/容器中有 /xyz,我不想复制
/xyz
到,/shared_volume_mount_location
如果我不需要的话。