OCI运行时执行失败:exec failed: (...) executable file not found in $PATH":unknown

我通过 libav-tools 修改了一个安装了 ffmpeg 的应用程序。这个应用程序启动时没有问题,但是问题出现在 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

这是我的文件:

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"]

我请求你们的帮助,非常感谢!

329457 次浏览

我在窗户上也遇到过这种事。 这些命令中的任何一个都可以工作

在 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 for Windows: 怪异..。:

其原因与尝试确保 posx 路径最终成为 正确地传递给 Git 实用程序 包括一个修改过的 MSYS 层,该层影响命令参数。

Linux 和 Windows 用户

根据容器中的 shell,可能需要使用 /bin/bash/bin/sh运行。使用 Shell而不是 Bash或者反过来也会导致这个错误。

去掉命令周围的引号。当您引用它时,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 错误后引号中的所有内容(例如 "exec: \"lsb_release -a\"中的 lsb_release -a)都是试图运行的二进制文件。确保图像中存在二进制文件。例如,如果您使用高山或 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 linefeeds 保存的(lf,而不是 cr + lf,当在 linux 中读取时,您不会希望在文件中显示 \r,因为它将成为要执行的命令的一部分)。

  • 如果运行的命令中没有指向二进制文件的完整路径,请检查图像中 $PATH的值,并验证二进制文件是否存在于其中一个目录中。例如,你可以通过 docker exec -it $cid /bin/shecho $PATHtype some_command来验证在你的路径中找到了 some_command

  • 如果您的命令不是一个可执行文件,而是一个 shell 内置文件,那么您需要使用一个 shell 来执行它,而不是直接执行。这可以用 docker exec -it $cid /bin/sh -c "your_shell_builtin"来实现

如果 @ Papigee解决方案不工作,可能您没有权限。

我尝试了 @ Papigee解决方案,但不工作没有 sudo。

我说了:

sudo docker exec -it <container id or name> /bin/sh

我这边出了点问题,我打过电话了

【错误】 docker run < image > < words > < command >

当我应该使用

多克运行 < 参数 > < 图像 > < 命令 >

类似问题的相同解决方案: https://stackoverflow.com/a/50762266/6278

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

  1. 运行集装箱:
    docker run -d <image-name>
    
  2. 列出容器:
    docker ps -a
    
  3. 使用容器 ID:
    docker exec -it <container-id> /bin/sh
    

您可以使用另一个 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>:/#

我解决的问题很简单:

  1. 运行码头 PS-A
  2. 检查容器的命令(mine 以/bin/sh 开始)
  3. 运行 docker-compose exec < name _ of _ service >/bin/sh (如果这是启动命令的原因)

这是为了解决当使用码头组成

我遇到了这个问题,结果发现我需要这样做:

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

这种事发生在我身上。我的问题是当我没有正确挂载 Docker 文件系统时引起的,所以我配置了磁盘映像位置和重新绑定文件共享挂载,这现在正常工作。 作为参考,我在 Windows 中使用 Docker 桌面。

docker exec -it <containerId> sh

在我的情况下,我保存了 Docker 映像,而不是加载到另一台机器上,我导入了它,这是非常不同的,并导致我一个类似的错误。

你必须像下面这样跑:

Docker exec sh-c‘ echo“ $ENV _ NAME”

我有一个 shell 脚本中的 Windows 行结束符

我当时在码头管理一个集装箱。

entrypoint:
- ls

起作用了,但是

entrypoint:
- ls tests

没有。

这是因为争论必须在不同的方向上进行

entrypoint:
- ls
- tests

如果在使用 docker run命令时出现此错误,则可能产生了一个简单的语法错误。

例子

错误:

docker run myimage -p 3838:3838


docker: Error response from daemon: failed to create shim: OCI runtime create
failed: container_linux.go:380: starting container process caused:
exec: "-p": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled

正确(选项去 之前图像名称) :

docker run -p 3838:3838 myimage