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

Docker容器无法找到runshortcuts.sh文件的排查求助

问题描述

我编写了一个runshortcuts.sh bash脚本,本地项目根目录下执行./runshortcuts.sh $args完全正常。使用node:14-alpine作为基础镜像,将本地项目根目录映射到容器内的/usr/src/app,且通过ls验证了本地与容器内目录结构一致。但在容器内执行该脚本时,无论直接运行./runshortcuts.sh还是用sh runshortcuts.sh,均提示:

OCI runtime exec failed: exec failed: unable to start container process: exec ./runshortcuts.sh: no such file or directory: unknown

脚本权限为-rwxrwxr-x,容器通过docker-compose up -d启动后状态正常。相关配置如下:

Dockerfile

FROM node:14-alpine
WORKDIR /usr/src/app
VOLUME /usr/src/app

docker-compose.yaml

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
      - "5000:5000"
    volumes:
      - .:/usr/src/app
    tty: true
问题原因
  1. Alpine镜像默认无bash环境:node:14-alpine基于轻量的Alpine Linux,默认仅预装ash shell而非bash。若脚本开头的shebang是#!/bin/bash,容器内找不到bash解释器,就会抛出“找不到文件”的误导性错误(实际是找不到解释器,而非脚本本身)。
  2. Windows换行符不兼容:若脚本在Windows环境下编写,换行符为CRLF,而Linux容器仅识别LF格式。此时脚本的shebang行会变成#!/bin/bash\r,系统无法识别带回车的路径,同样会触发“找不到文件”错误。
解决方法

修复bash缺失问题

  • 方案1:修改脚本shebang为#!/bin/sh,Alpine自带的ash兼容绝大多数bash基础语法,足以满足一般脚本需求。
  • 方案2:在Dockerfile中安装bash,修改后内容如下:
FROM node:14-alpine
RUN apk add --no-cache bash
WORKDIR /usr/src/app
VOLUME /usr/src/app

修复换行符问题

  • 将脚本换行符改为LF格式:
    • VS Code用户:点击右下角状态栏的CRLF,切换为LF;
    • 命令行方式(Linux/macOS或Git Bash):执行sed -i 's/\r$//' runshortcuts.sh。

验证操作

修改完成后,重新构建镜像并启动容器:

docker-compose down
docker-compose build
docker-compose up -d

进入容器执行脚本验证:

docker exec -it <容器名称或ID> ./runshortcuts.sh

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:05:38