Docker Compose运行时entrypoint.sh未找到问题求助
解决Docker Compose启动时entrypoint.sh找不到的问题
错误信息
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "./entrypoint.sh": stat ./entrypoint.sh: no such file or directory: unknown
原Dockerfile内容
FROM debian:bullseye ENV DEBIAN_FRONTEND noninteractive RUN apt-get update && apt-get install -y cmake build-essential curl git RUN echo "deb http://archive.raspberrypi.org/debian/ bullseye main" > /etc/apt/sources.list.d/raspi.list RUN curl "https://archive.raspberrypi.org/debian/raspberrypi.gpg.key" | apt-key add - RUN apt-get update && apt-get install -y libcamera-dev libjpeg-dev libgphoto2-dev RUN git clone https://github.com/ArduCAM/mjpg-streamer.git /src WORKDIR /src/mjpg-streamer-experimental RUN sed -i "/input_libcamera/p;/input_/d;/output_http/p;/output_/d" CMakeLists.txt RUN make && make install COPY entrypoint.sh /entrypoint.sh ENV INPUT_FLAGS "-r 1640x1232 -f 10" ENV OUTPUT_FLAGS "-w ./www" RUN chmod +x entrypoint.sh ENTRYPOINT ["./entrypoint.sh"]
Docker Compose配置
version: "3" services: mjpg-streamer: build: context: ./mjpg-streamer dockerfile: Dockerfile restart: always privileged: true ports: - 8080:8080 environment: - INPUT_FLAGS=-r 1640x1232 -f 10 - OUTPUT_FLAGS=-w ./www volumes: - /run/udev:/run/udev:ro - /opt/Octoprint/mjpg-streamer:/mjpg-streamer octoprint: image: octoprint/octoprint:latest restart: always privileged: true ports: - 9003:80 devices: - /dev/ttyUSB0:/dev/ttyUSB0 volumes: - /opt/Octoprint/data/octoprint:/octoprint - /proc/cpuinfo:/proc/cpuinfo:ro - /usr/bin/vcgencmd:/usr/bin/vcgencmd:ro - /usr/lib/aarch64-linux-gnu/libvcos.so.0:/usr/lib/aarch64-linux-gnu/libvcos.so.0:ro - /usr/lib/aarch64-linux-gnu/libvchiq_arm.so.0:/usr/lib/aarch64-linux-gnu/libvchiq_arm.so.0:ro
已尝试的调整方案
- 尝试1:修改ENTRYPOINT为
./mjpg-streamer/entrypoint.sh - 尝试2:COPY路径改为
/entrypoint.sh /entrypoint.sh,ENTRYPOINT保持./entrypoint.sh - 尝试3:COPY路径改为
/entrypoint.sh /entrypoint.sh,ENTRYPOINT改为./mjpg-streamer/entrypoint.sh - 尝试4:COPY路径改为
entrypoint.sh entrypoint.sh,ENTRYPOINT保持./entrypoint.sh - 尝试5:COPY路径改为
./mjpg-streamer/entrypoint.sh /entrypoint.sh,ENTRYPOINT保持./entrypoint.sh
问题根源与解决方法
核心根源
Dockerfile最后设置的WORKDIR是/src/mjpg-streamer-experimental,但你把entrypoint.sh复制到了根目录/entrypoint.sh,而ENTRYPOINT ["./entrypoint.sh"]是相对当前工作目录的路径,自然找不到文件。另外部分尝试中chmod命令用了相对路径,同样会因为WORKDIR的问题执行无效。
修复方案
方案1:使用绝对路径调用entrypoint
直接用绝对路径指定ENTRYPOINT,同时修正chmod的路径:
COPY entrypoint.sh /entrypoint.sh ENV INPUT_FLAGS "-r 1640x1232 -f 10" ENV OUTPUT_FLAGS "-w ./www" RUN chmod +x /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"]
方案2:将文件复制到当前WORKDIR
如果偏好相对路径,把entrypoint.sh复制到当前工作目录:
COPY entrypoint.sh ./entrypoint.sh ENV INPUT_FLAGS "-r 1640x1232 -f 10" ENV OUTPUT_FLAGS "-w ./www" RUN chmod +x ./entrypoint.sh ENTRYPOINT ["./entrypoint.sh"]
额外验证步骤(可选)
可以在Dockerfile中添加验证步骤,确保文件被正确复制:
RUN ls -l /entrypoint.sh # 对应方案1的路径 # 或者方案2用 RUN ls -l ./entrypoint.sh
隐藏坑排查
如果上述方案无效,检查entrypoint.sh的换行符:若脚本在Windows下编辑,CRLF换行符会导致容器执行时出现类似"文件找不到"的错误,可在Dockerfile中添加转换步骤:
RUN apt-get install -y dos2unix && dos2unix /entrypoint.sh
内容的提问来源于stack exchange,提问作者Naklsonofnakkl
相关产品推荐
相关产品推荐

