Docker Golang镜像执行FFmpeg命令报错:bash可执行文件未找到
解决方案
问题根源
Alpine Linux镜像默认不包含bash,它自带的默认shell是ash(属于busybox组件),因此你的Go代码调用bash会提示找不到可执行文件。另外命令里用到的convert工具来自ImageMagick,当前Dockerfile未安装该工具,后续执行也会报错,需要一并处理。
方案1:安装bash(不推荐,会增加镜像体积)
在Dockerfile中添加安装bash的命令:
FROM golang:alpine3.18 RUN apk add --no-cache ffmpeg bash imagemagick
修改后你的Go代码无需调整,即可正常通过bash执行命令。
方案2:改用默认的ash(推荐,保持镜像轻量化)
无需额外安装bash,直接将Go代码里的bash替换为sh:
cmd := "ffmpeg -i Untitled.mp4 -vf \"fps=5,scale=320:-1:flags=lanczos\" -c:v pam -f image2pipe - | convert -delay 5 - -loop 0 -layers optimize test.gif" _, err := exec.Command("sh", "-c", cmd).Output() if err != nil { fmt.Println(fmt.Sprintf("Failed to execute command: %s", err)) }
同时记得在Dockerfile中安装ImageMagick(依赖convert工具):
FROM golang:alpine3.18 RUN apk add --no-cache ffmpeg imagemagick
额外提示
如果你的命令涉及复杂bash专属语法(如数组、特定扩展),才需要安装bash;仅执行简单管道命令的话,sh完全可以胜任,优先选择方案2更契合Alpine镜像轻量化的设计理念。
内容的提问来源于stack exchange,提问作者Eran
相关产品推荐
相关产品推荐

