构建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
相关产品推荐
相关产品推荐

