假设我们有一个简单的 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 下载另一个图像,将其作为容器运行,然后将数据从它复制到上述文件中声明的容器中?
看起来像this article解释如何。
但并不是 100% 清楚它是如何工作的。看起来您创建了一些共享卷,使用该共享卷启动了两个容器?</p>
所以我根据该链接,将其添加到我的 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
如果我不需要.
最佳答案
如何在另一个容器开始使用 kubernetes 之前运行一个容器并完成一项工作?
使用 initContainers - 更新您的 deployment.yml,假设 example.com/nltk_data:latest
是您的数据图像
如何在不覆盖共享卷的情况下写入共享卷?
正如您所知道的,您的镜像中有什么,您需要选择一个合适的安装路径。我会使用 /mnt/nltk_data
使用初始容器更新 deployment.yml
spec:
volumes:
- name: shared-data
emptyDir: {}
initContainers:
- name: init-ikg-api-demo
imagePullPolicy: Always
# You can use command, if you don't want to change the ENTRYPOINT
command: ['sh', '-c', 'cp -r /nltk_data_source /mnt/nltk_data']
volumeMounts:
- name: shared-data
mountPath: /mnt/nltk_data
image: example.com/nltk_data:latest
containers:
- name: ikg-api-demo
imagePullPolicy: Always
volumeMounts:
- name: shared-data
mountPath: /nltk_data
image: example.com/main_api:private_key
ports:
- containerPort: 80
关于kubernetes - 如何使用kubernetes将数据从一个容器cp到另一个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56860922/