Docker 错误:无法启动容器";在$PATH中找不到可执行文件:“未知”;

Docker 错误:无法启动容器";在$PATH中找不到可执行文件:“未知”;,docker,kubernetes,Docker,Kubernetes,我对docker Kubernetes很陌生。我已经创建了3个节点的集群,现在我正在为pod创建一个YAML文件。我从图片名称为utkudarilmaz/hping3的图片中拍摄了这张图片。有人能帮我在路径中设置命令或docker文件吗?因为我不能理解这个问题。我想运行我的吊舱成功工作,以便我可以利用它。 我的YAML文件像 --- apiVersion: v1 kind: Pod metadata: name: second labels: app: web sp

我对docker Kubernetes很陌生。我已经创建了3个节点的集群,现在我正在为pod创建一个YAML文件。我从图片名称为utkudarilmaz/hping3的图片中拍摄了这张图片。有人能帮我在路径中设置命令或docker文件吗?因为我不能理解这个问题。我想运行我的吊舱成功工作,以便我可以利用它。 我的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。我已经找到了 我需要一个命令来连续运行容器,否则,如果我在YAML文件中像上面的命令那样指定一个命令:[“hping3 103.22.221.59”],那么当我运行时,它就会进入循环

kubectl exec –it second – hping3 [IP_ADDRESS]
我明白了

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

在路径中找不到相同的错误文件首先,您不需要在此处指定
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
事实上,您甚至不需要提供任何
命令
,因为
hping3
在这个docker映像中已经定义为
入口点
,您实际上不需要覆盖它。运行
hping3
Pod
所需的全部是以下yaml清单:

apiVersion: v1
kind: Pod
metadata:
  name: second
spec:
  containers:
    - name:  hping3
      image: utkudarilmaz/hping3
      args: ["IP-address"]
是的,在这种情况下必须提供一些
args
,否则您的容器将陷入
CrashLoopBackOff
状态

正如您可以在以下内容中看到的图像的非常简短的描述:

用法:

docker pull utkudarilmaz/hping3:latest
docker run utkudarilmaz/hping3:latest [parameters] target_ip
提供
target\u ip
是强制性的,但您不必提供任何其他内容

尽管上面的使用说明没有说明在kubernetes上运行此图像,但这样的简短说明对我们来说应该已经足够了,我们应该能够将其“从docker翻译为kubernetes语言”

请查看官方kubernetes文档中标题为的以下部分,尤其是片段:

当您覆盖默认入口点和Cmd时,以下规则适用:

  • 如果不为容器提供
    命令
    参数
    ,则使用Docker图像中定义的默认值

  • 如果为容器提供了
    命令
    但没有
    args
    ,则只使用提供的
    命令
    。默认入口点和 忽略Docker映像中定义的默认Cmd

  • 如果仅为容器提供
    args
    ,则Docker映像中定义的默认入口点将与该容器的
    args
    一起运行 你提供的

  • 如果提供
    命令
    参数
    ,则会忽略Docker图像中定义的默认入口点和默认Cmd。你的
    命令
    参数一起运行

综上所述,我们对第三点特别感兴趣:

  • 如果仅为容器提供
    args
    ,则Docker映像中定义的默认入口点将与该容器的
    args
    一起运行 你提供的
这意味着在我们的kubernetes
Pod
定义中,我们只能提供
args
,这是完全正确的。由于
入口点
已在
utkudarilmaz/hping3
图像中定义,因此无需通过定义
命令来覆盖它

只有在
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
顺便说一句,命令中的连字符看起来有点奇怪,它们与
-
的字符不完全相同,从问题中的代码段复制时解释不正确,导致如下奇怪错误:

Error from server (NotFound): pods "–it" not found
因此,请注意您在命令中使用的确切字符

关于您在描述
kubectl
您的
Pod
时看到的错误消息的解释:

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

它清楚地表明,在您的
$PATH
中找不到名为“hping3[IP address]”(是的,单个文件的名称!)的可执行文件,我确信在
命令:
中没有具有此名称的可执行文件,命令名及其参数需要是单独的单词<代码>命令:[“hping3”,“103.22.221.58”]
。几天前,我写了一个较长的解释。@david Maze我们可以有任何通用命令来帮助持续运行容器吗?它应该做什么?把容器想象成一个过程;“我可以在不指定命令的情况下创建一个进程”并不是很有意义,同样地,仅仅拥有一个空容器也不是特别有用。就像这个,但这在我的CVA中也不起作用,我希望它会起作用,是的。
"hping3 [IP-address]": executable file not found in $PATH: unknown