Dockerfile中CMD指令容器运行时未自动执行,容器内手动执行正常
问题根因
Dockerfile中两条COPY指令的目标路径配置错误,路径开头多了多余的.符号,导致文件没有被复制到预期的绝对路径:
COPY ./nginxstart.sh ./usr/sbin/nginxstart.sh会将脚本复制到容器当前工作目录下的相对路径usr/sbin/中,Ubuntu基础镜像默认工作目录为/root,因此脚本实际存储路径为/root/usr/sbin/nginxstart.sh,而CMD指令调用的/usr/sbin/nginxstart.sh路径下不存在对应可执行文件,容器启动时因找不到执行文件直接退出,表现为CMD没有自动执行。- 手动进入容器可以执行成功,通常是因为进入容器时你手动将脚本放到了正确路径,或是执行时使用的是相对路径命中了实际存放位置。
修复方案
- 修正Dockerfile中的COPY指令目标路径,移除开头多余的
.,使用绝对路径:
#My Dockerfile FROM ubuntu RUN apt-get update RUN echo 8 4 |apt-get install -y nginx COPY ./index.html /var/www/html/ COPY ./nginxstart.sh /usr/sbin/nginxstart.sh RUN chmod 755 /usr/sbin/nginxstart.sh CMD ["/usr/sbin/nginxstart.sh"]
- 额外检查
nginxstart.sh的启动逻辑,确保脚本末尾有前台驻留进程(例如添加nginx -g 'daemon off;'),避免脚本执行完成后容器直接退出,误判为CMD未生效。
验证方式
重新构建镜像后启动容器,执行docker ps查看容器是否处于运行状态,也可执行docker logs <容器ID>查看启动日志,确认脚本是否正常执行。
内容的提问来源于stack exchange,提问作者user2915977
相关产品推荐
相关产品推荐

