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

Mar*_*rio 3 bash virtualization docker dockerfile docker-compose

我能够通过docker build -t foo/bar ..
这是它的Dockerfile

FROM ubuntu:20.04

COPY benchmark.sh /home/benchmarking-programming-languages/benchmark.sh
CMD [ "/home/benchmarking-programming-languages/benchmark.sh -v" ]
Run Code Online (Sandbox Code Playgroud)

这是文件benchmark.sh

FROM ubuntu:20.04

COPY benchmark.sh /home/benchmarking-programming-languages/benchmark.sh
CMD [ "/home/benchmarking-programming-languages/benchmark.sh -v" ]
Run Code Online (Sandbox Code Playgroud)

但是,通过运行它docker run -it foo/bar会出现错误:

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

尽管如此,当通过 shell 将图像作为容器运行时docker run -it foo/bar sh,我不仅可以看到该文件,而且可以毫无错误地执行它!
有人可以提出错误发生的原因以及如何修复它吗?

acr*_*ran 5

您中Dockerfile您已指定CMD

CMD [ "/home/benchmarking-programming-languages/benchmark.sh -v" ]
Run Code Online (Sandbox Code Playgroud)

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

由于您只指定了一个字符串,docker因此尝试调用可执行文件/home/benchmarking-programming-languages/benchmark.sh -v- 即名为“ ”的文件benchmark.sh -v,其名称中包含空格并以-v. 但您实际上想要做的是使用参数benchmark.sh调用脚本。-v

您可以通过将参数正确指定为单独的字符串来完成此操作:

CMD ["/home/benchmarking-programming-languages/benchmark.sh", "-v"]
Run Code Online (Sandbox Code Playgroud)

或者使用shell 语法

CMD /home/benchmarking-programming-languages/benchmark.sh -v
Run Code Online (Sandbox Code Playgroud)