Docker容器启动报错求助:exec /usr/local/bin/run-docker-project不存在
排查Docker容器启动报错:exec /usr/local/bin/run-docker-project: no such file or directory
核心矛盾点先理清
你的Dockerfile里有个容易混淆的地方:本地的run-docker-project脚本被COPY到容器内的/usr/local/bin/run-access-in-docker,但容器ENTRYPOINT指向的/usr/local/bin/run-docker-project是从access-service.deb解压出来的。启动报错说明这个解压后的文件要么不存在,要么无法被正确执行(比如shebang不兼容)。
构建环节加日志的具体操作
1. 验证deb包解压结果
在dpkg-deb --extract步骤后直接检查目标文件,确保解压成功:
RUN dpkg-deb --extract /var/access-service/access-service.deb / && \ ls -la /usr/local/bin/run-docker-project && \ # 新增:确认文件存在 chmod 0755 /usr/local/bin/run-docker-project && \ /bin/rm -f /var/access-service/access-service.deb
构建时用docker build --no-cache .强制重新构建,盯着这一步的输出——如果ls命令报错,说明deb包本身就没包含这个文件,大概率是Ubuntu更新后,本地生成deb包的流程出了问题。
2. 确认COPY的脚本是否到位(可选)
虽然ENTRYPOINT没用这个文件,但可以确认COPY步骤是否正常:
COPY installation/scripts/docker/run-docker-project /usr/local/bin/run-access-in-docker RUN ls -la /usr/local/bin/run-access-in-docker # 新增:检查COPY结果
3. 检查脚本的shebang兼容性
Alpine默认没有bash,如果解压出来的run-docker-project脚本开头是#!/bin/bash,会触发类似"文件找不到"的错误。可以在构建时查看shebang:
RUN dpkg-deb --extract /var/access-service/access-service.deb / && \ ls -la /usr/local/bin/run-docker-project && \ head -n 1 /usr/local/bin/run-docker-project && \ # 新增:查看脚本开头的解释器 chmod 0755 /usr/local/bin/run-docker-project && \ /bin/rm -f /var/access-service/access-service.deb
如果确实是bash的shebang,就在apk add命令里加上bash:
RUN apk add --no-cache unzip dpkg curl ttf-dejavu bash
4. 手动进入镜像排查
如果构建日志显示一切正常,但启动还是报错,直接启动镜像的shell手动验证:
docker run --rm -it <你的镜像名称> sh # 进入容器后执行以下命令 ls -la /usr/local/bin/run-docker-project ./usr/local/bin/run-docker-project # 直接执行看具体错误
其他排查方向
- 检查本地deb包的完整性:Ubuntu更新后,生成
access-service.deb的工具(比如dpkg)版本可能变化,导致deb包结构异常。可以在本地执行dpkg-deb --extract build/distributions/docker/access-service.deb /tmp/test,看看/tmp/test/usr/local/bin/下是否有run-docker-project。 - 清理docker-compose缓存:运行
docker-compose build --no-cache,避免复用旧的构建层。 - 检查Docker版本兼容性:Ubuntu更新后Docker版本有没有被动更新?虽然你用的是24.0.7,但可以确认下构建上下文的权限、文件路径是否有变化。
内容的提问来源于stack exchange,提问作者Evan Scott
相关产品推荐
相关产品推荐

