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

Ste*_*mer 188 docker

我有一个安装的docker镜像grunt,但是当我尝试运行它时,我收到一个错误:

Error response from daemon: Cannot start container foo_1: \
    exec: "grunt serve": executable file not found in $PATH
Run Code Online (Sandbox Code Playgroud)

如果我以交互模式运行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"]
Run Code Online (Sandbox Code Playgroud)

sar*_*ink 261

当我粘贴我的错误消息时,这是google上的第一个结果,这是因为我的论点不正常.

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

坏:

docker run <container_name> -v $(pwd):/src -it
Run Code Online (Sandbox Code Playgroud)

好:

docker run -v $(pwd):/src -it <container_name>
Run Code Online (Sandbox Code Playgroud)

  • 如果您在开始编码之前总是仔细阅读文档,那么您将永远无法完成任何工作.当你购买新车时,在开车回家之前,你是否阅读了200页的手册?没有.当你的车出现问题时,你是先把它谷歌了,还是去拿手册?这是完全合理的,我只能想象所有发现它有用但没有点击upvote按钮的人!有点不合理的是,这个完全不相关的答案是这个错误消息的第一个google结果,或者docker cli是不直观和无情的.干杯. (104认同)
  • 哇,如果不是这个答案,我会挣扎一段时间.为什么UNIX不具备标准,灵活且功能强大的CLI参数解析器?... (6认同)
  • 在许多脚本中,标志的顺序并不重要,所以我可以看到为什么这会发生在任何人身上.答案很有帮助.不用说来自docker的错误消息根本没用. (5认同)
  • 我被接受的答案误导了,想写我自己的,但似乎已经在这里了.所以我可以确认这解决了这个问题...... (3认同)
  • 这是问题的核心 (2认同)

Kev*_*ist 170

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

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

有关这方面的更多信息,请参见Dockerfile参考的CMD部分.

  • 这是参考 https://docs.docker.com/engine/reference/builder/#cmd 的 CMD 部分的链接 (3认同)

小智 21

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

docker run -ti devops -v /tmp:/tmp /bin/bash
Run Code Online (Sandbox Code Playgroud)

当我改为

docker run -ti -v /tmp:/tmp devops /bin/bash
Run Code Online (Sandbox Code Playgroud)

它工作正常.

  • 它对我有用,但我不明白这里 `-v` 的用法。`-v` 是绑定挂载一个卷(如 `docker run --help | grep "\-v"` 中所述),对我来说,我已经在 `File Sharing`(Docker 设置)中挂载了 `/tmp` ),那我为什么要再次使用它? (2认同)

Par*_*rsa 14

我遇到了同样的问题,经过大量谷歌搜索后,我无法找到如何解决它。

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

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

不是容器名称!

这是我的一个令人尴尬的错误。

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

这是文档中提到的修复方法。

在此输入图像描述


bey*_*eal 12

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

ENTRYPOINT [ "bash", "entrypoint.sh" ]
Run Code Online (Sandbox Code Playgroud)


Ben*_*asy 8

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

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

解: chmod +x docker-entrypoint.sh


Gaj*_*jus 5

可以构建没有外壳的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
Run Code Online (Sandbox Code Playgroud)