【问题标题】:Copy file inside Kubernetes pod from another container从另一个容器复制 Kubernetes pod 内的文件
【发布时间】:2021-01-25 22:47:29
【问题描述】:

我需要在创建期间在我的 pod 中复制一个文件。我不想使用ConfigMapSecrets。我正在尝试创建一个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 错误。任何帮助或建议都非常感谢。

【问题讨论】:

    标签: kubernetes google-kubernetes-engine


    【解决方案1】:

    这是不可能的。

    让我解释一下:你需要把它想象成两个不同的machine。这里你的本地机器是文件所在的机器,你想用cp将它复制到另一台机器上。但这是不可能的。这就是你在这里要做的。您正在尝试将文件从您的机器复制到 pod 的机器。

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

    【讨论】:

      【解决方案2】:

      我同意 H.R. Emon 提供的答案,它解释了为什么您不能只在容器内运行 kubectl cp。我也认为可以添加一些资源来向您展示如何处理此特定设置。

      对于这个特定的用例,建议使用initContainer

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

      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 不能用于此特定设置的重要原因包括在内。

      【讨论】:

      • 非常感谢您的回复。我尝试了 HR Emon 方法。我能够存储它。这对我不起作用,因为我试图从我的本地文件中复制它,但互联网上不存在。因此,正如 HR 建议的那样,我使用 Dockerfile 复制了它并创建了 init 容器,将其移动到共享卷上。
      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多