【问题标题】:Docker, \"ping\": executable file not found in $PATH": unknownDocker,\"ping\":$PATH 中找不到可执行文件":未知
【发布时间】:2018-03-24 10:38:41
【问题描述】:

我在同一个网络上有这两个容器

docker inspect my_app_net
[
    {
        "Name": "my_app_net",
        "Id": "e136b758e8009e0361168aa0ead14ec85973c8d4f93e65122c22a2ff18f5e61f",
        "Created": "2018-03-22T21:11:51.781623693+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "a966584cd491caff18b25fa347b738a0853e5195ac517b5fb26bb019a271fc10": {
                "Name": "new_pizd",
                "EndpointID": "fdbacbbd564aeacccc57367dd082232e0498976ca485597b6ba8f6c82a0d4240",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "b36f350efca1f2e79bef8027a32f992021091fdd701e4d55d98af78984072150": {
                "Name": "new_nginx2",
                "EndpointID": "38731d2618aba0a7c63debd3b30a4c9b530d83a4fddbda97cdd2498298007120",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

当我尝试从第一个 ping 第二个时

docker container exec -it new_pizd ping new_nginx2 
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"ping\": executable file not found in $PATH": unknown

这很奇怪。 如何检查 docker 变量 $PATH?它指的是哪个可执行文件? 编辑

建议的答案要求 echo PATH,但它与我的 Ubuntu shell 中的相同

docker exec -ti new_nginx2 echo $PATH
/home/milenko/eclipse:/home/milenko/miniconda3/bin:/home/milenko/bin:/home/milenko/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

milenko@milenko-System-Product-Name:~$ docker exec -ti new_nginx2 bash
root@b36f350efca1:/# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

我已经检查了bin,里面没有ping

root@b36f350efca1:/bin# ls ping*
ls: cannot access 'ping*': No such file or directory

【问题讨论】:

  • 我更新了我的答案,你能检查一下是不是这样吗?
  • 使用 alpine 将是最好的解决方案,而不是安装它。 Tribid_bose 答案效果很好。事实上,布雷特也说了同样的话。

标签: docker


【解决方案1】:

首先进入容器#1中的bash

docker container exec -it CONTAINER bash

在 bash 中,键入

apt update

那么,

apt install iputils-ping

那么,

exit

然后输入 ping 命令,它应该可以正常工作

例如docker container exec -it new_pizd ping new_nginx2

【讨论】:

  • 如果你想从两个容器互相ping,你需要在两个容器上都安装ping。
  • 如果你想从另一个容器 ping 一个容器,那么它们都应该在你创建的同一个网络上。它在默认网络中不起作用。
【解决方案2】:

输出

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"ping\": executable file not found in $PATH": unknown

表示未找到ping 命令($PATH 配置错误,或ping 不可用,或其他原因)。

如何检查 docker 变量 $PATH?

运行$ docker exec -ti <CONTAINER> echo $PATH,应该会输出如下内容

编辑:应该是$ docker exec -ti <CONTAINER> bash -c 'echo "$PATH"'

/home/user/.bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

$PATH 是在 *nix shell 中设置的环境变量,它包含查找可执行文件的目录。

它指的是哪个可执行文件?

正如它在错误输出中所说,ping 可执行文件。知道$PATH的内容后,就可以检查问题出在哪里了(ping应该在/bin,至少在我这里atm的容器上),然后尝试解决。

要打开交互式控制台以检查/处理容器,请运行 $ docker exec -ti <CONTAINER> bash


更新

我检查了bin,里面没有ping

您可能必须安装 iputils-ping,查看答案 here,但基本上(假设您的容器基于 Debian 或 Ubuntu 或类似发行版)运行

$ apt-get update
$ apt-get install iputils-ping

【讨论】:

  • 是的,很抱歉,它应该是docker exec -ti <CONTAINER> bash -c 'echo "$PATH"',否则你的shell 会扩展$PATH。我会更正我的答案。
【解决方案3】:

步骤-1

docker container exec -it mynginx ping newnginx

如果上述步骤出错

OCI 运行时执行失败:执行失败:container_linux.go:348:正在启动 容器进程导致“exec:”ping“:找不到可执行文件 $PATH":未知

步骤-2

docker container exec -it mynginx bash

第三步

apt-get update

第四步

apt-get install iputils-ping

步骤-4

Exit()

第五步

docker container exec -it mynginx ping newnginx

它会ping通。

【讨论】:

    【解决方案4】:

    可能是您的容器没有 ping。使用docker exec -it <Container_Name> bash 登录到该容器,这将打开容器内的 bash。然后键入以下命令。 apt-get update;apt-get install iputils-ping;

    【讨论】:

      【解决方案5】:

      不要在 docker 容器运行命令中使用 nginx,因为 nginx 映像没有 ping 命令,而是使用 nginx:alpine。 nginx:alpine 映像具有与之关联的 ping 命令。示例如下

      docker container run --name new_nginx2 -d --network my_app_net nginx:alpine
      

      【讨论】:

      • 应该是答案。最简单的解决方案。
      猜你喜欢
      • 2021-09-16
      • 1970-01-01
      • 2020-03-31
      • 2022-09-23
      • 1970-01-01
      • 2019-01-16
      • 2015-01-25
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多