【问题标题】:Restart only sidecar container in Kubernetes在 Kubernetes 中仅重启 sidecar 容器
【发布时间】:2019-07-19 02:58:52
【问题描述】:

我的 POD 中有两个容器。第一个容器是我的主要应用程序,第二个容器用作具有以下图像的边车容器,具有以下 Dockerfile。

FROM scratch

EXPOSE 8080
ADD my-binary /

ENV GOROOT=/usr/lib/go
ENTRYPOINT ["/my-binary"]

基本上它使用 scratch 并且 my-binary 是一个作为进程运行的 go 应用程序。所以我不能在这个边车容器上exec。我需要重新启动侧容器(​​my-binary),但主容器应该没有变化。不应以任何方式更改主容器。

有没有可能,我怎样才能做到这一点?

非常感谢您对此进行调查。

有人要求提供完整的 POD 详细信息,那么您可以考虑以下 pod 结构

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  labels:
    app: my-deploy
spec:
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: main
        image: my-main-app-image
        ports:
        - containerPort: 80
      - name: my-go-binary
        image: my-go-binary-image

请注意-

kubectl exec POD_NAME -c CONTAINER_NAME reboot 

这不适用于第二个容器,因为它是临时图像。

【问题讨论】:

  • 请提供更多细节。还提供您的 pod.yaml。
  • 我不确定为什么整个 POD 结构在这里很重要,但我只是提供了一个示例以防万一。

标签: docker kubernetes containers


【解决方案1】:

因此,您的 reboot 命令不起作用(当然它会更新),原因是使用 scatch 作为基础映像。

此图像在构建基本图像(例如 debianbusybox)或超极小图像(仅包含单个二进制文件及其所需的任何内容,例如 hello-world)的上下文中最有用。

见,https://hub.docker.com/_/scratch

基础镜像scratch是Docker保留的最小镜像。它可以作为构建小型容器的起点。使用scratch“镜像”向构建过程发出信号,您希望 Dockerfile 中的下一个命令成为镜像中的第一个文件系统层。

参考:https://docs.docker.com/develop/develop-images/baseimages/#create-a-simple-parent-image-using-scratch

根据您提供的 dockerfile,唯一的文件系统是您的 go-binery。没有别的了。这就是你不能(不能)运行reboot 命令的原因。如果您更改基本映像,如 busyboxalpine 或其他任何内容,您将能够运行 reboot 命令。

但请记住,您的新基础映像必须具有适当的 shell 才能运行您预期的命令。例如,busybox 映像具有 shell (bash),因此可以运行 reboot 命令。 alpine 图像也有 shell (sh)。

【讨论】:

  • 感谢您的回答,但我无法将临时图像更改为任何其他基础图像,如 alpine 等。
  • 您提供的参考链接docs.docker.com/develop/develop-images/… 无效
  • 抱歉链接无效。修复了无效链接。
猜你喜欢
  • 2016-07-12
  • 1970-01-01
  • 2021-02-26
  • 2020-05-03
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
相关资源
最近更新 更多