【问题标题】:Error: failed to start container " executable file not found in $PATH: unknown"错误:无法启动容器“$PATH 中找不到可执行文件:未知”
【发布时间】:2021-06-10 10:03:40
【问题描述】:

我对 docker Kubernetes 很陌生。我已经创建了 3 个节点的集群,现在我正在创建一个 YAML 文件来创建 pod。我从https://github.com/utkudarilmaz/docker-hping3 拍摄了图像,图像名称是utkudarilmaz/hping3。有人可以帮我在路径中设置命令或 docker 文件吗?因为我无法理解这个问题。我想成功运行我的 pod,以便我可以使用它。 我的 YAML 文件像

---
 apiVersion: v1
 kind: Pod
 metadata:
   name: second
   labels:
     app: web
 spec:
   containers:
     - name:  hping3
       image: utkudarilmaz/hping3
       command: ["hping3 [IP_ADDRESS"]
       ports:
         - containerPort: 80
   nodeSelector:
       disktype: ssd

如果我没有指定 [command],我的 pod 状态是 CrashLoopBackOff。我搜索了一下,发现My kubernetes pods keep crashing with "CrashLoopBackOff" but I can't find any log 我需要一个命令来连续运行容器,否则如果我在 YAML 文件中指定一个命令,如上面的命令:["hping3 103.22.221.59"] 然后当我运行时,它会进入循环

kubectl exec –it second – hping3 [IP_ADDRESS]

我明白了

error: unable to upgrade connection: container not found ("hping3")

kubectl decribe pod second 的输出

Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  3m39s                 default-scheduler  Successfully assigned default/second1 to netcs
  Normal   Pulled     3m35s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.714028668s
  Normal   Pulled     3m31s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.734426606s
  Normal   Pulled     3m15s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.61256593s
  Normal   Pulled     2m46s                 kubelet            Successfully pulled image "utkudarilmaz/hping3" in 2.65727147s
  Warning  BackOff    2m11s (x5 over 3m4s)  kubelet            Back-off restarting failed container
  Normal   Pulling    2m4s (x5 over 3m38s)  kubelet            Pulling image "utkudarilmaz/hping3"
  Normal   Created    119s (x5 over 3m35s)  kubelet            Created container hping3
Warning  Failed     119s (x5 over 3m35s)  kubelet            Error: failed to start container "hping3": Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "hping3 103.22.221.59": executable file not found in $PATH: unknown


  Normal   Pulled     119s                  kubelet            Successfully pulled image "utkudarilmaz/hping3" in 5.128803062s

docker inspect $utkudarilmaz/hping3 的一些输出


"Mounts": [],
        "Config": {
            "Hostname": "104e9920881b",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": true,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": null,
            "Image": "utkudarilmaz/hping3",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "hping3"
            ],
            "OnBuild": null,
            "Labels": {
                "desription": "hping3 tool building on Alpine:latest",
                "version": "1.0"

我的容器不会继续运行 当我尝试这个命令时

command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ] from 
https://stackoverflow.com/questions/31870222/how-can-i-keep-a-container-running-on-kubernetes/40093356

在路径中找不到相同的错误文件

【问题讨论】:

  • command:中,命令名及其参数需要是单独的单词; command: ["hping3", "103.22.221.58"]。几天前我写了this answer,并给出了更长的解释。
  • @david Maze 我们可以有任何通用命令来帮助持续运行容器
  • 它应该做什么?把容器想象成一个进程; “我可以在不指定命令的情况下创建一个进程吗?”实际上并没有那么有意义,同样地,只放一个空容器也不是特别有用。
  • stackoverflow.com/questions/31870222/… 喜欢这个,但这在我的 cvase 中也不起作用
  • 我希望这应该可行,是的。

标签: docker kubernetes


【解决方案1】:

首先,您不需要在此处指定containerPort,因为您的hping3 容器中的任何tcp 端口上都没有任何监听:

$ kubectl exec -ti second -- /bin/sh                                                                               
/ # netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

事实上,您甚至不需要提供任何command,因为hping3 已在此docker 映像中定义为ENTRYPOINT,您实际上不需要覆盖它。运行 hping3 Pod 所需的只是以下 yaml 清单:

apiVersion: v1
kind: Pod
metadata:
  name: second
spec:
  containers:
    - name:  hping3
      image: utkudarilmaz/hping3
      args: ["IP-address"]

是的,在这种情况下必须提供一些args,否则您的容器将进入CrashLoopBackOff 状态。

正如您在其README.md 中对该图像的非常简短的描述:

用法:

docker pull utkudarilmaz/hping3:latest
docker run utkudarilmaz/hping3:latest [parameters] target_ip

提供target_ip 是强制性的,但您不必提供任何其他内容。

虽然上面的使用描述并没有说明在 kubernetes 上运行这个镜像,但是这样简短的描述对我们来说应该是完全足够的,我们应该能够将它翻译成“来自 docker kubernetes 语言”。

查看官方 kubernetes 文档中标题为 Define a Command and Arguments for a Container 的以下部分,尤其是 this 片段:

当您覆盖默认的入口点和 Cmd 时,这些规则适用:

  • 如果您不为 Container 提供 commandargs,则使用 Docker 映像中定义的默认值。

  • 如果您为容器提供command 但没有args,则仅使用提供的command。默认入口点和 Docker 镜像中定义的默认 Cmd 被忽略。

  • 如果您只为容器提供args,则 Docker 映像中定义的默认入口点将使用 args 运行 你提供的。

  • 如果您提供 commandargs,则会忽略 Docker 映像中定义的默认入口点和默认 Cmd。您的 command 与您的 args 一起运行。

从上面我们特别感兴趣的第三点:

  • 如果您只为容器提供args,则Docker 映像中定义的默认入口点将使用args 运行 你提供的。

这意味着在我们的 kubernetes Pod 定义中,我们可能只提供 args 并且完全没问题。由于ENTRYPOINT 已在utkudarilmaz/hping3 映像中定义,因此无需通过定义command 来覆盖它。

我能够重现您仅在尝试连接到处于 CrashLoopBackOff 状态的 hping3 容器时收到的错误消息:

$ kubectl exec -ti second -- hping3 [IP-address]                                                                  
error: unable to upgrade connection: container not found ("hping3")

但是当它运行时,kubectl exec 可以正常工作:

$ kubectl exec -ti second -- hping3 [IP-address]
HPING [IP-address] (eth0 [IP-address]): NO FLAGS are set, 40 headers + 0 data bytes

顺便说一句。命令中的连字符看起来有点奇怪,它们与- 的字符不完全相同,并且在从问题中的代码 sn-p 复制时无法正确解释,从而导致如下奇怪的错误:

Error from server (NotFound): pods "–it" not found

所以请注意您在命令中使用的确切字符。

关于你kubectl describe你的Pod时看到的错误信息的解释:

"hping3 [IP-address]": executable file not found in $PATH: unknown

它清楚地表明在您的$PATH 中找不到名为“hping3 [IP-address]”(是的,单个文件的名称!)的可执行文件,我确定您没有具有该名称的可执行文件?

如果您以这种方式提供command

command: ["hping3 [IP-address]"]

请记住,双引号之间的整个字符串被解释为单个命令/可执行文件。这就是为什么它试图寻找名为“hping3 [IP-address]”的可执行文件,但由于明显的原因它找不到它。

正如cmets中已经提到的,command字段的正确用法可以是:

command: ["hping3","[IP-address]"]

但在你的情况下,你并不需要它。

希望以上解释对你有所帮助。

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2022-09-23
    • 2021-08-17
    相关资源
    最近更新 更多