我有一个安装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"]
答案 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 docs,docker run
的最后一部分是您要运行的命令及其加载容器后的参数。
没有容器名称!!!
那是我尴尬的错误。
下面我为您提供了命令行图片,以查看我做错了什么。
这是docs中提到的解决方法。
答案 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的软引用: