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

当前回答

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

其他回答

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

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

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

不是容器名!!

这是我的尴尬错误。

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

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

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

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

更多的信息可以在Dockerfile参考的CMD部分中找到。

问题是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

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

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

Bad:

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

好:

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

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