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

时间:2014-11-26 21:03:44

标签: docker

我有一个安装grunt的泊坞窗图片,但是当我尝试运行它时,我收到错误:

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

10 个答案:

答案 0 :(得分:216)

当我粘贴我的错误消息时,这是google上的第一个结果,这是因为我的论据无序。

在所有参数之后,容器名称必须是

为:

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

好:

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

答案 1 :(得分:147)

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

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

有关此问题的更多信息,请参见Dockerfile reference的CMD部分。

答案 2 :(得分:18)

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

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

当我将其更改为

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

它工作正常。

答案 3 :(得分:7)

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

在我的情况下,这是由于我下载后的可执行文件(Ghost blog Dockerfile中的docker-entrypoint.sh)缺少可执行文件模式。

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

答案 4 :(得分:3)

构建的Docker容器可能没有外壳(例如https://github.com/fluent/fluent-bit-docker-image/issues/19)。

在这种情况下,您可以复制静态编译的shell并执行它,例如

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

答案 5 :(得分:1)

我遇到了同样的问题,经过大量的搜索之后,我找不到解决方法。

突然我注意到我的愚蠢错误:)

As mentioned in the docsdocker run的最后一部分是您要运行的命令及其加载容器后的参数。

没有容器名称!!!

那是我尴尬的错误。

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

这是docs中提到的解决方法。

enter image description here

答案 6 :(得分:1)

在显示的错误消息中:

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

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

[ "grunt serve" ]

在类似您的撰写文件中。这是无效的,因为json语法要求您拆分每个参数,这些参数通常由外壳程序在每个空间上为您拆分。例如:

[ "grunt", "serve" ]

将这两个参数都合并为一个参数的另一种可能方法是,如果要在docker run命令中将它们都引用为单个arg,例如

docker run your_image_name "grunt serve"

在这种情况下,您需要删除引号,以便将其作为单独的args传递给run命令:

docker run your_image_name grunt serve

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

  • 您还记得在图像中包含二进制文件吗?如果运行多阶段映像,请确保在最后阶段运行二进制安装。使用交互式外壳运行图像并确认它存在:

    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
    
  • 如果使用卷运行映像,则该卷可以覆盖映像中可执行文件所在的目录。卷不与映像合并,它们与其他Linux文件系统安装一样,被安装在文件系统树中。这意味着在挂载点来自父文件系统的文件不再可见。 (请注意,命名卷是由docker从映像内容初始化的,但这仅在命名卷为空时才会发生。)因此,解决方法是不将卷安装在您要从映像运行可执行文件的路径的顶部。

答案 7 :(得分:0)

由于某种原因,除非添加“ bash”澄清器,否则将收到该错误。即使在我的入口点文件顶部添加“#!/ bin / bash”也无济于事。

backlog.select.with_index { |obj,idx|
  puts "nil at #{idx}" if obj == nil
}

答案 8 :(得分:0)

问题是glibc,它不是apline基础iamge的一部分。

添加后对我有用:)

以下是获取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

答案 9 :(得分:-3)

使其工作添加对/ usr / bin的软引用:

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

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