docker:在$PATH中找不到可执行文件

我有一个安装grunt的docker映像,但当我试图运行它时,我得到一个错误:

Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH

如果我在交互模式下运行bash, grunt是可用的。

我做错了什么?

这是我的Dockerfile:

# https://registry.hub.docker.com/u/dockerfile/nodejs/ (builds on ubuntu:14.04)
FROM dockerfile/nodejs


MAINTAINER My Name, me@email.com


ENV HOME /home/web
WORKDIR /home/web/site


RUN useradd web -d /home/web -s /bin/bash -m


RUN npm install -g grunt-cli
RUN npm install -g bower


RUN chown -R web:web /home/web
USER web


RUN git clone https://github.com/repo/site /home/web/site


RUN npm install
RUN bower install --config.interactive=false --allow-root


ENV NODE_ENV development


# Port 9000 for server
# Port 35729 for livereload
EXPOSE 9000 35729
CMD ["grunt"]
568062 次浏览

当你使用exec格式的命令(例如,CMD ["grunt"],一个带有双引号的JSON数组),它将在shell中执行没有。这意味着大多数环境变量将不会出现。

如果将命令指定为常规字符串(例如CMD grunt),则CMD之后的字符串将使用/bin/sh -c执行。

有关此的更多信息可在Dockerfile参考. CMD部分中找到。

这是我粘贴错误消息时谷歌上的第一个结果,这是因为我的参数顺序不对。

容器名必须是所有参数的

缺点:

docker run <container_name> -v $(pwd):/src -it

好:

docker run -v $(pwd):/src -it <container_name>

我也发现了同样的问题。我做了以下事情:

docker run -ti devops -v /tmp:/tmp /bin/bash

当我把它改成

docker run -ti -v /tmp:/tmp devops /bin/bash

它工作得很好。

出现这样的错误有几种可能的原因。

在我的情况下,这是由于可执行文件(docker-entrypoint.sh来自鬼博客Dockerfile)在我下载后缺乏可执行文件模式。

解决方案:chmod +x docker-entrypoint.sh

为了让它工作,在/usr/bin中添加软引用:

Ln -s $(哪个节点)/usr/bin/node

Ln -s $(npm) /usr/bin/npm

出于某种原因,除非我添加了“bash”澄清符,否则我会得到这个错误。甚至加上“#!”“/bin/bash”到我的入口点文件的顶部并没有帮助。

ENTRYPOINT [ "bash", "entrypoint.sh" ]

Docker容器可以在没有shell的情况下构建(例如https://github.com/fluent/fluent-bit-docker-image/issues/19)。

在这种情况下,你可以复制一个静态编译的shell并执行它。

docker create --name temp-busybox busybox:1.31.0
docker cp temp-busybox:/bin/busybox busybox
docker cp busybox mycontainerid:/busybox
docker exec -it mycontainerid /bin/busybox sh

我也有同样的问题,在谷歌上搜索了很多次后,我不知道如何解决它。

突然我发现我犯了个愚蠢的错误:)

正如文档中提到的docker run的最后一部分是你加载容器后要运行的命令及其参数。

不是容器名!!

这是我的尴尬错误。

下面我为您提供了我的命令行图片,以查看我做错了什么。

这是在文档中提到的修复。

enter image description here

在错误信息中显示:

Error response from daemon: Cannot start container foo_1: \
exec: "grunt serve": executable file not found in $PATH

它抱怨的是无法找到可执行文件grunt serve,而不是无法找到带有参数serve的可执行文件grunt。对于这个特定的错误,最可能的解释是使用json语法运行命令:

[ "grunt serve" ]

在你的合成文件中。这是无效的,因为json语法要求您拆分通常由shell在每个空格上拆分的每个参数。例如:

[ "grunt", "serve" ]

另一种可能的方法是在docker run命令中将它们引用到一个参数中。

docker run your_image_name "grunt serve"

在这种情况下,你需要删除引号,这样它就可以作为单独的参数传递给run命令:

docker run your_image_name grunt serve

对于其他人来说,executable file not found意味着Linux不会看到你试图在容器中使用默认$PATH值运行的二进制文件。这可能意味着有很多可能的原因,下面是一些:

  • 你记得在你的图像中包含二进制吗?如果运行多阶段映像,请确保在最后一个阶段运行二进制安装。使用交互式shell运行您的映像,并验证它是否存在:

    docker run -it --rm your_image_name /bin/sh
    
  • 当你进入容器时,你的路径可能会被交互式shell修改,特别是如果你使用bash,所以你可能需要指定容器内二进制文件的完整路径,或者你可能需要更新Dockerfile中的路径:

    ENV PATH=$PATH:/custom/dir/bin
    
  • 二进制文件可能没有设置执行位,因此您可能需要使其可执行。用chmod完成:

    RUN chmod 755 /custom/dir/bin/executable
    
  • 二进制文件可以包含动态链接的库,这些库在映像中不存在。你可以使用ldd来查看动态链接库的列表。一个常见的原因是使用glibc(大多数Linux环境)编译和使用musl(由Alpine提供)运行:

    ldd /path/to/executable
    
  • 如果您使用卷运行映像,则该卷可以覆盖映像中可执行文件所在的目录。卷不会与映像合并,它们与任何其他Linux文件系统挂载一样挂载在文件系统树中。这意味着挂载点上的父文件系统中的文件不再可见。(注意,命名卷由docker从镜像内容初始化,但这只发生在命名卷为空时。)因此,解决方法是不要将卷挂载在有希望从映像运行的可执行文件的路径之上。

  • 如果你在不同的平台上运行二进制文件,并且没有使用--fix-binary选项配置binfmt_misc, qemu将在容器文件系统名称空间内查找解释器,而不是在主机文件系统中。有关此问题的更多详细信息,请参阅Ubuntu bug报告

  • 如果错误来自shell脚本,问题通常是该脚本的第一行(例如#!/bin/bash)。由于上述原因,该命令不存在于映像中,或者文件没有使用Linux linefeeds保存为ascii或utf8。你可以尝试dos2unix来修复换行,或者检查你的git和编辑器设置。

问题是glibc,它不是apline基映像的一部分。

添加后,它为我工作:)

下面是获得glibc的步骤

apk --no-cache add ca-certificates wget
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk
apk add glibc-2.28-r0.apk

指标题。

我的错误是在docker run期间通过--env-file放置变量。在其他文件中,该文件由PATH扩展名:PATH=$PATH:something组成,这导致PATH var看起来像PATH=$PATH:something (var解析没有执行)而不是PATH:/usr/bin...:something

我无法通过--env-file使分辨率工作,所以我看到这个工作的唯一方法是在Dockerfile中使用ENV

我在使用docker-compose时遇到了这个问题。这里或这个相关的问题上的解决方案都没有解决我的问题。最终对我有用的是用docker prune -a清除所有缓存的docker工件并重新启动docker。

我得到了这个错误信息,当我建立阿尔卑斯山基地图像:

ERROR: for web  Cannot start service web: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "bash": executable file not found in $PATH: unknown

在我的docker-compose文件中,我有一个命令指令,其中使用bash和bash执行命令时不附带alpine base image。

command: bash -c "python manage.py runserver 0.0.0.0:8000"
然后我实现并执行命令使用sh (shell)。