【发布时间】: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:24 和 fedora: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 运行而不是您的应用程序。