You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建Docker镜像时CMD可用但RUN失效的原因是什么?

问题原因与解决方法

核心问题

你根本没把本地的script.sh复制到Docker镜像里。

为什么两种写法表现不同?

用RUN ["sh", "script.sh"]时构建失败

RUN是镜像构建阶段执行的命令,每一步RUN都会在当前镜像环境里执行操作。此时你的镜像里只有Ubuntu基础镜像的内容,没有本地的script.sh,所以执行sh script.sh自然会提示找不到文件,直接导致构建失败。

用CMD ["sh", "script.sh"]时构建成功但启动会报错

CMD是容器启动阶段才会执行的命令,它只是把要执行的命令写到镜像的元数据里,构建过程中不会实际运行这个命令,所以构建能顺利完成。但如果你启动容器docker run test,还是会出现和之前一样的"找不到script.sh"错误——因为镜像里依然没有这个文件。

正确的解决方案

在Dockerfile里添加COPY步骤,把本地的script.sh复制到镜像中,修改后的Dockerfile如下:

FROM ubuntu
# 把本地的script.sh复制到镜像的根目录下
COPY script.sh /script.sh
# 如果要在构建阶段执行脚本,保留RUN
RUN ["sh", "/script.sh"]
# 如果要在容器启动时执行脚本,用CMD(注意路径要和COPY的一致)
# CMD ["sh", "/script.sh"]

这样不管是用RUN还是CMD,镜像里都有了script.sh文件,就能正常执行了。

内容的提问来源于stack exchange,提问作者Ooker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:43:21