在Kubernetes中从另一个容器复制文件到Pod内

3
我需要在创建Pod的同时复制一个文件。我不想使用ConfigMap和Secrets。我尝试创建一个volumeMounts并使用kubectl cp命令来复制源文件,我的清单如下所示。
apiVersion: v1
kind: Pod
metadata:
    name: copy
    labels:
      app: hello
spec:
  containers:
  - name: init-myservice
    image: bitnami/kubectl
    command: ['kubectl','cp','./test.json','init-myservice:./data']
    volumeMounts:
    - name: my-storage
      mountPath: data
  - name: init-myservices
    image: nginx
    volumeMounts:
    - name: my-storage
      mountPath: data
  volumes:
  - name: my-storage
    emptyDir: {}

但是我遇到了CrashLoopBackOff错误。非常感谢您提供任何帮助或建议。

2个回答

2
我同意H.R. Emon提供的答案,它解释了为什么你不能在容器内部运行kubectl cp。我认为还可以添加一些资源来展示如何处理这种特定的设置。
对于这个特定的用例,建议使用initContainer

initContainers - 在Pod中应用容器之前运行的专用容器。Init容器可以包含不在应用程序镜像中的实用程序或设置脚本。

Kubernetes.io: Docs: Concepts: Workloads: Pods: Init-containers

你可以使用官方Kubernetes文档中的示例(假设下载你的test.json是可行的):
apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
 containers:
 - name: nginx
   image: nginx
   ports:
   - containerPort: 80
   volumeMounts:
   - name: workdir
     mountPath: /usr/share/nginx/html
 # These containers are run during pod initialization
 initContainers:
 - name: install
   image: busybox
   command:
   - wget
   - "-O"
   - "/work-dir/index.html"
   - http://info.cern.ch
   volumeMounts:
   - name: workdir
     mountPath: "/work-dir"
 dnsPolicy: Default
 volumes:
 - name: workdir
   emptyDir: {}

-- Kubernetes.io: Docs: Tasks: Configure Pod Initalization: Create a pod that has an initContainer

你可以根据自己的需求修改上面的示例。

此外,针对您的特定示例,有一些需要注意的事项:


额外资源:

一个侧面的说明!

在这种特定的设置中,我也认为包括为什么不能使用SecretsConfigMaps是很重要的。


1
非常感谢您的回应。我尝试了HR Emon方法。我成功地储存了它。但是这对我没有用,因为我试图从本地文件复制它,而该文件并不在互联网上。所以像HR建议的那样,我使用Dockerfile将其复制,并创建初始化容器,将其移动到共享卷上。 - Abhinav

1

这是不可能的。

让我解释一下:你需要将其视为两个不同的机器。在这里,您的本地机器是文件存在的地方,您想将其复制到另一台带有cp的机器上。但这是不可能的。而这正是您在这里尝试做的。您试图将文件从您的机器复制到pod的机器上。

在这里,您可以做一件事,只需为init-container创建自己的docker镜像。并在构建docker镜像之前复制要存储的文件。然后,您可以将该文件复制到共享卷中,您想要存储该文件的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接