泊坞窗:在$ PATH中找不到可执行文件


216

我有一个安装的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"]

你可以尝试使用构建docker CMD grunt吗?还是可以尝试通过传递完整路径来执行grunt命令?
mgaido

@ mark91能不能请您详细说明您正在使用什么要求重新构建CMD grunt?你的意思是放下[""]
史蒂夫·洛里默

刚刚尝试了-它奏效了-谢谢!因此,对于任何其他进入的人,请更改CMD ["grunt"]CMD grunt
Steve Lorimer,2014年

10
这是因为如果您CMD ["grunt"]使用另一个Shell执行命令,那么在该Shell中可能不会设置$ PATH。
mgaido

Answers:


197

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

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

有关更多信息,请参阅Dockerfile参考的CMD部分。



请问这个愚蠢的问题,但是如何在没有外壳的情况下执行linux命令呢?在Linux机器上执行此操作(不使用docker)等效于什么?
wisbucky

1
要回答我自己的问题,这类似于执行sudo set(exec set)。这些命令将失败,因为它们在没有外壳的情况下执行命令(并且set是内置的外壳)。但是,由于实际的二进制文件,sudo ls因此(exec ls)将起作用。ls/bin/ls
wisbucky

314

这是我粘贴错误消息时在Google上的第一个结果,这是因为我的参数不正确。

容器名称必须所有参数之后。

坏:

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

好:

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

131
如果您在开始编码之前总是仔细阅读文档,那么您将永远无法完成任何工作。当您购买新车时,在开车回家之前是否阅读过200页的手册?否。当您的汽车出现问题时,您是先搜索Google还是获得手册?这是完全合理的,我只能想象所有发现它有用但还没有单击upvote按钮的人!什么是不合理的是,这个完全不相关的答案是此错误消息的第一个Google结果,或者docker cli是不直观和不宽容的。干杯。
2016年

7
在许多脚本中,标志的顺序并不重要,因此我可以理解为什么任何人都可能发生这种情况。答案很有帮助。不用说,来自docker的错误消息根本没有用。
marios

9
哇,如果不是这个答案,我会努力一段时间。UNIX为什么没有标准的,灵活而强大的CLI参数解析器?...
lleaff

1
这是我的问题。将容器名称放到最后似乎很有效
Rob Segal

3
我被接受的答案误导了,想写我自己的答案,但似乎已经来了。因此,我可以确认这可以解决问题……
Arturas M

24

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

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

当我将其更改为

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

它工作正常。


1
它对我有用,但是我不明白-v这里的用法。-v是绑定安装一个卷(如中所述docker run --help | grep "\-v"),对我来说,我已经/tmpFile Sharing(Docker设置)中安装了,为什么还要再次使用它?
艾哈迈德(Ahmad)

12

出现此类错误的原因可能有多种。

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

解: chmod +x docker-entrypoint.sh


这是为我指出正确答案的评论。我必须先复制文件,然后对其进行chmod。
超过剧场版'18 -10-30

7

可以构建没有外壳的Docker容器(例如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

4

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

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

@SteveLorimer,是的。我做了一个COPY,然后RUN chmod +x /compile_nibbler.sh在入口点调用之前。
超越剧场

1

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

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

如文档中所述,最后一部分docker run是要在容器加载后要运行的命令及其参数。

不是容器名称!

那是我尴尬的错误。

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

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

在此处输入图片说明


-7

为了使其工作,向/ usr / bin添加软引用:

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

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


1
请添加有关如何帮助他的描述。
马修斯阳光明媚
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.