让我们说我有一个使用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容器的stdin / stdout。
有什么想法吗?
更新
根据格雷厄姆oc run
的评论确实应该像docker run
一样工作,但似乎并非如此。使用原始的Fedora图像,bash总是至少在出现时出现。
# 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
存在另一个问题,因为该命令会创建我不太需要的新容器。我希望有一种方法可以轻松地启动调试,然后让容器自动解除。
答案 0 :(得分:2)
调试pod有三个主要命令:
oc describe pod $pod-name
- 有关广告连播的详细信息
oc logs $pod-name
- 广告连播的stdout和stderr
oc exec -ti $pod-name -- bash
- 在运行pod中获取shell
针对您的具体问题:oc run
默认提款政策设为Always
。这意味着OpenShift将尝试将图像拉到成功并拒绝使用本地图像。
一旦this kuberenetes patch登陆OpenShift,可以轻松配置提取政策。
编辑:重写
答案 1 :(得分:0)
请不要将此视为问题的最终答案,并以您自己更好的答案取而代之......
我现在正在使用如下的pod配置文件......
lst.split()
请注意,该命令已明确设置为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"
。然后,您可以创建窗格,附加到容器并自行运行docker命令。
bash
这看起来很不理想,它并没有真正帮助您调试具有标准pod配置的普通openhift容器,但至少现在可以进行调试。期待更好的答案。