OCI运行时执行失败:执行失败:(...)在$PATH中找不到可执行文件:未知。

199
我将一个安装了 ffmpeg 的应用 docker 化了,通过 libav-tools 安装。这个应用程序可以启动而没有问题,但是当 fluent-ffmpeg npm 模块尝试执行 ffmpeg 命令时出现问题,因为命令找不到。当我想要检查 ffmpeg 的版本和镜像中设置的 linux 发行版时,我使用了 sudo docker exec -it c44f29d30753 "lsb_release -a" 命令,但是它会给出以下错误:OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"lsb_release -a\": executable file not found in $PATH": unknown 然后我意识到无论我尝试在镜像或容器内部运行哪些命令,都会给我相同的错误。
OCI runtime exec failed: exec failed: container_linux.go:296: starting container process caused "exec: \"ffmpeg -a\": executable file not found in $PATH": unknown

这是我的 Dockerfile:

FROM ubuntu:xenial
FROM node
RUN apt-get -y update
RUN apt-get --yes install libav-tools
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app
RUN npm install
COPY . /usr/src/app
RUN npm run build
ENV NODE_ENV production
EXPOSE 8000
CMD ["npm", "run", "start:prod"]

我想恳请您的帮助。非常感谢!


7
尝试使用docker run --rm -ti your-image-name sh进入容器,找到可执行文件。这可能只是一个PATH问题(即包含可执行文件的目录未在容器内根用户的PATH中)。 - whites11
我运行了 apt-get -y update && apt-get -y upgrade 命令,但在容器内尝试运行 lsb_release -a 时,输出为 sh: 4: lsb_release: not found。ffmpeg也是一样的情况:sh: 5: ffmpeg: not found。然后我运行了 apt-get install libav-tools 并得到如下信息:# apt-get install libav-tools Reading package lists... Done Building dependency tree Reading state information... Done libav-tools is already the newest version.。如果我执行 find -name "ffmpeg" 命令,输出为空。 - Uğur Kaya
1
首先,您必须找到可执行文件的绝对路径(可能使用find命令)。 然后,您有两个选项: 1)在docker的CMD中使用可执行文件的完整路径(以及一般情况下您调用可执行文件的任何地方) 2)将包含二进制文件的目录添加到PATH环境变量的末尾,例如:export PATH=$PATH:/my/bin/folder - whites11
请参见 https://dev59.com/JV4d5IYBdhLWcg3wHPc9 - That Brazilian Guy
这里获取更多解决方案。 - MD SHAYON
显示剩余6条评论
16个回答

250

这件事发生在我使用Windows系统时。请查看下面的命令,找出符合您情况的命令。

注意:

您需要在容器中使用正确的shell运行下面符合您情况的命令,例如/bin/bash/bin/sh。如果您使用错误的shell,例如使用sh而不是bash,可能会出现错误。因此,请确认您正在使用正确的shell,或者尝试两种shell,看哪一种有效。 对于这些示例,我将使用sh

在Windows CMD上(不切换到bash):

docker exec -it <container-id> /bin/sh

在 Windows CMD 中(切换到 Bash 后):

docker exec -it <container-id> //bin//sh
或。
winpty docker exec -it <container-id> //bin//sh

在 Git Bash 上:

winpty docker exec -it <container-id> //bin//sh

对于Windows用户,原因在Git的ReleaseNotes文件中有记录,并且在此处得到了很好的解释 - Bash in Git for Windows: Weirdness... :

原因是为了确保posix路径被正确地传递给git工具。因此,Git for Windows包含一个修改过的MSYS层,影响命令参数。

Linux

docker exec -it <container-id> /bin/sh


4
这个命令可能需要运行在 /bin/bash 或者 /bin/sh 中。 - Indra
7
"kubectl exec -it <pod_name> /bin/sh" 对我有用,谢谢。 - sgauri
1
我在使用alpine基础镜像时也遇到了这种错误,因为我是在bash中执行命令而不是从shell中执行。对于alpine基础镜像,请使用shell。 - Muhammad Faizan Fareed
1
在最近的Git Bash(4.4)版本中,只需在路径开头添加'/'即可 - docker exec <container> //bin/bash -c "ls //usr/bin" - shaktisinghr
当使用apline(迷你)版本的镜像时,会发生这种情况,因此没有bash,最好使用迷你版本,如/bin/sh等。 - Vladimir Ch
显示剩余2条评论

78
docker exec -it <containerId> sh

4
OCI运行时执行失败:执行失败:无法启动容器进程:exec:“sh”:在$PATH中找不到可执行文件:未知。 - pszaba
1
这对我在我的 EC2 上的 Amazon Linux 2 上做到了。 - Amon
这对我在M1 Mac上起了作用。 - undefined
这对我在M2 Mac上起了作用。 - undefined

41

由于我的一个简单订购错误导致了这个问题。我打电话过去

[WRONG] docker run <image> <arguments> <command>

而应该使用

docker run <arguments> <image> <command>

类似问题的解决方案: https://dev59.com/rKzka4cB1Zd3GeqP2AWr#50762266


1
如果我正在使用docker-compose,可能会出现什么错误? 我运行了以下命令:docker-compose -f .\a-docker-compose-file.yml up - otong
2
@otong,你的评论与我的答案无关。请将其作为新问题发布,并在那里提供更多有关您特定问题的详细信息。 - Henrik Heimbuerger
2
这也适用于Docker Compose,并且为我解决了问题。非常感谢。 - David

25

去掉你的命令周围的引号。当你将它引用时,docker 尝试将完整字符串 "lsb_release -a" 作为命令运行,但这个命令不存在。相反,你希望使用参数 -a 运行命令 lsb_release,而且不需要加引号。

sudo docker exec -it c44f29d30753 lsb_release -a

请注意,容器名称后的所有内容都是要在容器内运行的命令和参数,Docker不会将它们处理为Docker命令选项。


对于那些遇到此错误的人,我建议进行以下调试步骤:

  • 验证参数的顺序。容器名称/ID之后的所有内容都是要运行的命令。因此,你不应该使用docker exec $cid -it /bin/sh,因为这将尝试在$cid容器中运行-it命令。相反,你应该使用docker exec -it $cid /bin/sh

  • 查看失败的命令,引号内的所有内容都是要运行的可执行文件(例如,在“exec: \"lsb_release -a\"”中的lsb_release -a)。确保该文件存在于你的镜像中。例如,如果你正在使用Alpine或Busybox,可能不存在bash,但存在/bin/sh。该文件名是完整的字符串,例如,你可以运行ls "/usr/bin/lsb_release -a"并查看带有空格和-a的文件。

  • 如果你正在使用Windows和Git bash,并看到命令前缀了一个很长的路径,那么这是Git bash尝试进行一些自动转换,例如/path/to/binary,你可以通过在第一个斜杠后加倍数符号来禁用它,例如//bin/sh

  • 如果你要运行的命令是容器内的脚本,请检查该脚本的第一行,其中包含#!/path/to/interpreter,确保该解释器在镜像中存在于该路径,并且该脚本使用Linux行结束符(LF,而不是CR + LF,在Linux中读取文件时不会显示\r,因为这成为要执行的命令的一部分)。

  • 如果要运行的命令没有完整路径,请检查镜像中$PATH的值,并验证该可执行文件是否存在于其中一个目录中。例如,你可以使用docker exec -it $cid /bin/sh并运行echo $PATHtype some_command来验证some_command是否在你的路径中找到。

  • 如果你要运行的命令不是可执行文件,而是shell内置命令,则需要使用shell进行执行,而不是直接执行。可以使用docker exec -it $cid /bin/sh -c "your_shell_builtin"


25
如果@papigee的解决方案不起作用,可能是您没有权限。
我尝试了@papigee的解决方案,但没有使用sudo无法工作。
我做了:
sudo docker exec -it <container id or name> /bin/sh

是的,这个方法可行,谢谢。我以为图像中有“/bin/bash”,但实际上没有,不过“/bin/sh”可以用来满足我的需求。 - johnpitchko

17

我用以下命令解决了这个问题:

  1. 运行容器:
  2. docker run -d <image-name>
    
    列出容器:
    docker ps -a
    
    请提供更多上下文信息以便进行准确翻译。
    docker exec -it <container-id> /bin/sh
    

6

我遇到了这个问题,后来发现我需要做这个:

docker run ${image_name} bash -c "${command}"

2
我所采取的解决方法很简单:
  1. 运行docker ps -a
  2. 检查容器的命令(我的是以/bin/sh开头)
  3. 运行docker-compose exec < name_of_service > /bin/sh(如果这是启动你的命令的方式)
此方法适用于使用docker compose时出现的问题。

2

您可以使用另一个shell来执行相同的命令:

当我执行时收到的错误:

最初的回答

[jenkins@localhost jenkins_data]$ docker exec -it mysqldb \bin\bash
OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "exec: \"binsh\": executable file not found in $PATH": unknown

解决方案: 当我使用bash shell执行以下命令时,它可以正常工作:
[jenkins@localhost jenkins_data]$ docker exec -it mysqldb bash
root@<container-ID>:/#

我非常确定你的问题在于你在\bin\sh中使用了反斜杠。Linux不使用这些,因此它会将它们剥离掉。请改用/bin/sh。"bash"之所以可行是因为没有反斜杠。 - Alejandro703

1
我正在Docker Compose中运行一个容器。
entrypoint:
  - ls

工作了,但是可能存在问题。
entrypoint:
   - ls tests

没有。

这是因为参数必须分别放在不同的行上。

entrypoint:
   - ls 
   - tests

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接