Docker 在 docker run 命令上给出“没有这样的文件或目录:未知”

问题描述 投票:0回答:1

我能够通过

docker build -t foo/bar .
成功构建一个Docker镜像。
这是它的Dockerfile

FROM ubuntu:20.04

COPY benchmark.sh /home/benchmarking-programming-languages/benchmark.sh
CMD [ "/home/benchmarking-programming-languages/benchmark.sh -v" ]

这是文件benchmark.sh

#!/usr/bin/env bash
## Nothing here, this is not a typo

但是,通过

docker run -it foo/bar
运行它给我错误:

调用远程方法“docker-run-container”时出错:错误:(HTTP 代码 400)意外 - 无法创建垫片:OCI 运行时创建失败:container_linux.go:380:启动容器进程导致:exec:“/home/benchmarking -programming-languages/benchmark.sh -v": stat /home/benchmarking-programming-languages/benchmark.sh -v: 没有这样的文件或目录:未知

尽管如此,当通过

docker run -it foo/bar sh
将图像作为带有外壳的容器运行时,我不仅可以看到文件,而且可以毫无错误地执行它!
有人可以提出错误发生的原因以及如何解决吗?

bash docker docker-compose dockerfile virtualization
1个回答
4
投票

您的

Dockerfile
中,您已将
CMD
指定为

CMD [ "/home/benchmarking-programming-languages/benchmark.sh -v" ]

这使用了 CMD

 指令的 JSON 语法,即是一个字符串数组,其中第一个字符串是可执行文件,后面的每个字符串都是该可执行文件的参数。

由于您只指定了一个字符串

docker
尝试调用可执行文件
/home/benchmarking-programming-languages/benchmark.sh -v
- 即一个名为“benchmark.sh -v”的
file
,其名称中包含一个空格并以
-v
结尾。但是您实际上打算做的是使用
benchmark.sh
参数
调用-v脚本。

您可以通过将参数正确指定为单独的字符串来做到这一点:

CMD ["/home/benchmarking-programming-languages/benchmark.sh", "-v"]

或使用 shell 语法

CMD /home/benchmarking-programming-languages/benchmark.sh -v
© www.soinside.com 2019 - 2024. All rights reserved.