【问题标题】:Kubernetes can't deploy simple image from Docker hub via GithubKubernetes 无法通过 Github 从 Docker hub 部署简单镜像
【发布时间】:2019-08-28 18:43:22
【问题描述】:

我对这类东西真的很陌生,对 Kubernetes 和 Docker 很陌生,但在 Java 方面已经有了一些经验。

我尝试通过将 Docker Hub 连接到 GitHub 来使用它。

在我的 Git-hub 上只有 2 个代码:

  1. Dockerfile
  2. 简单的 hello world Java 代码。

每次我在 Kubernetes 上运行它并使用 kubectl get pods 检查它时,我总是会遇到 CrashLoopBackOff。

我不明白是什么问题,我已经检查了代码并尝试在 Docker 上运行它,它可以工作,它打印出 hello world。但不是在 Kubernetes 上。

这是 Dockerfile 上的代码

FROM openjdk:8
COPY helloworld.java .
RUN javac helloworld.java
ENTRYPOINT ["java", "helloworld"]

这是简单的helloworld java的代码

public class helloworld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

我的预期是:当我在 Kubernetes 上运行它时,我希望它说它已经准备好了,我可以将它部署到 IP 并显示简单的 hello world。

【问题讨论】:

    标签: java docker kubernetes


    【解决方案1】:

    您需要提供复制、运行和入口点命令的位置。 在文件名前加上路径,比如

    复制 helloworld.java /helloworld.java 运行 javac /helloworld.java 入口点 ["java", "/helloworld]

    【讨论】:

      【解决方案2】:

      也假设一些事情。假设镜像运行良好,并且唯一的问题是 docker 容器在没有进程运行时被关闭,你要做的就是强制一个进程运行一段时间。

      所以,你可以这样做:

      kubectl run hello-world --image YOUR-IMAGE sleep 100

      这将创建一个deployment hello-world。一个 pod hello-world-xxxxxx-xxxx 会运行 100 秒,然后它会死掉,然后会创建一个新容器再运行 100 秒,以此类推。

      收到确认后,您可以:

      kubectl get po

      复制 pod 的名称,并获取日志:

      kubectl logs YOUR-POD-NAME

      你应该会看到 hello world。

      【讨论】:

        【解决方案3】:

        由于您没有指定如何执行它,我假设您一直在使用kubectl run(默认创建部署)或定义部署的清单。如果是这样,那么CrashLoopBackOff 是预期的,因为deployments 用于长时间运行的进程。您的 Java 代码不是长时间运行的。它打印一些东西然后退出,也就是说,那里没有无限循环。

        因此,要么在循环中执行System.out.println(中间有睡眠?),要么使用一次性执行的运行命令或工作负载类型(例如jobs)。

        顺便说一句,即使有部署,您仍然应该能够使用 kubectl logs 查看第一次执行的输出。

        【讨论】:

          猜你喜欢
          • 2020-09-16
          • 2021-11-22
          • 1970-01-01
          • 1970-01-01
          • 2014-08-27
          • 2021-02-13
          • 2020-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多