【问题标题】:how to debug container images using openshift如何使用 openshift 调试容器镜像
【发布时间】:2019-10-09 21:32:10
【问题描述】:

假设我有一个使用 Dockerfile 创建的 docker 映像。在编写 Dockerfile 时,我不得不反复测试它以意识到我做错了什么。要调试 docker 映像,我可以简单地运行一个测试容器并查看它的 stdout/stderr 以了解映像有什么问题。

IMAGE_NAME=authoritative-dns-bind
IMAGE_OPTIONS="
    -v $(pwd)/config.yaml:/config.yaml:ro
    -p 127.0.0.1:53:53
    -p 127.0.0.1:53:53/udp"

docker run -t -i $IMAGE_OPTIONS $IMAGE_NAME

了解以上内容足以迭代地创建和调试一个最小的工作 Docker 容器。现在我正在寻找一种方法来为 OpenShift 做同样的事情。

我非常清楚容器还没有为 OpenShift 做好准备。我的计划是像使用 Docker 一样运行它并观察它的 stdoud/stderr。我请求帮助的一个人提出了一个看起来正是我需要的命令。

oc run -i -t --image $IMAGE_NAME --command test-pod -- bash

上述命令对我来说似乎适用于来自 docker 注册表的 fedora:24fedora:latest 图像,并且我得到了一个工作 shell。但是对于我的带有容器化服务的派生图像,同样的情况不会发生。我的解释是它可能做了完全不同的事情,它不是以交互方式启动命令,而是以非交互方式启动它,然后尝试在失败的容器中运行bash

所以我正在寻找一种在 OpenShift 中调试容器映像的合理方法。我希望我至少能够捕获和查看 OpenShift 容器的标准输入/标准输出。

有什么想法吗?

更新

根据 Graham 的评论,oc run 确实应该像 docker run 一样工作,但似乎并非如此。对于原始的 Fedora 映像,bash 总是至少在按 Enter 时出现。

# oc run -i -t --image authoritative-dns-bind --command test-auth13 -- bash
Waiting for pod myproject/test-auth13-1-lyng3 to be running, status is Pending, pod ready: false
Waiting for pod myproject/test-auth13-1-lyng3 to be running, status is Pending, pod ready: false
Waiting for pod myproject/test-auth13-1-lyng3 to be running, status is Pending, pod ready: false
...
Waiting for pod myproject/test-auth13-1-lyng3 to be running, status is Pending, pod ready: false    
^C
# 

我无法尝试建议的oc debug,因为它似乎需要更多配置而不仅仅是简单的图像。 oc run 还有另一个问题,因为该命令创建了我并不真正需要的新容器。我希望有一种方法可以轻松启动调试并在之后自动破坏容器。

【问题讨论】:

  • 当您说“使用容器化服务的派生映像不会发生这种情况”时,您实际上看到了什么?将oc run 与命令一起使用时,它不应该启动任何东西,而应该只运行你给它的命令。因此,一切都不会失败。此外,如果您已经尝试部署映像包含的应用程序,您也可以使用oc debug dc mydcname。这将使用与实际应用程序相同的配置启动容器,除了附加到终端会话和 shell 运行而不是您的应用程序。

标签: docker openshift fedora


【解决方案1】:

调试 pod 的主要命令有以下三个:

  1. oc describe pod $pod-name -- pod 的详细信息

  2. oc logs $pod-name -- pod的stdout和stderr

  3. oc exec -ti $pod-name -- bash -- 在运行的 pod 中获取 shell

针对您的具体问题:oc run 默认拉取策略设置为Always。这意味着 OpenShift 会尝试拉取镜像,直到成功并拒绝使用本地镜像。

一旦this kuberenetes patch 登陆 OpenShift 源,拉取策略将很容易配置。

【讨论】:

  • 要得到一个shell,你也可以使用oc rsh $pod-name
  • oc logs 命令返回Unrecognized input header(没有换行符)。这看起来不像预期的结果。
  • @fer.marino 如果容器不起作用,这将无济于事,这在第一次实验中很常见,就像我的情况一样。
【解决方案2】:

请不要将此视为问题的最终答案,并用您自己更好的答案取代它...

我现在正在使用如下的 pod 配置文件...

apiVersion: v1
kind: Pod
metadata:
  name: "authoritative-dns-server"  # pod name, your reference from command line
  namespace: "myproject"  # default namespace in `oc cluster up`
spec:
  containers:
    - command:
        - "bash"
      image: "authoritative-dns-bind"  # use your image!
      name: "authoritative-dns-bind-container"  # required
      imagePullPolicy: "Never"  # important! you want openshift to use your local image
      stdin: true
      tty: true
  restartPolicy: "Never"

请注意,该命令已明确设置为 bash。然后,您可以创建 pod,附加到容器并自己运行 docker 命令。

oc create -f pod.yaml
oc attach -t -i authoritative-dns-server
/files/run-bind.py

这看起来远非理想,它并不能真正帮助您调试具有标准 pod 配置的普通 openshift 容器,但至少现在可以调试了。期待更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    相关资源
    最近更新 更多