Docker运行ActiveMQ镜像报错:exec ./bin/activemq: no such file or directory
你遇到的问题是:基于提供的Dockerfile构建的镜像,在某台服务器可正常运行,但在Windows的Docker Desktop中执行docker run -it 123:11时,报错exec ./bin/activemq: no such file or directory,且已确认容器内该文件存在。以下是可能的差异原因及解决思路:
1. 脚本换行符不兼容(最常见原因)
Windows系统默认使用CRLF(回车+换行)作为文本换行符,而Linux容器内的Shell脚本要求使用LF(仅换行)。如果构建镜像时,apache-activemq-5.17.1/bin/activemq脚本文件带有Windows格式的换行符,会导致脚本开头的Shebang(#!/bin/sh)被解析为#!/bin/sh^M,系统无法识别这个解释器,从而抛出"文件不存在"的错误(实际是解释器找不到,而非脚本文件本身)。
验证方法
进入容器后执行:
cat -A ./bin/activemq | head -1
如果输出显示#!/bin/sh^M$,说明存在CRLF换行符问题。
解决方法
- 构建镜像前,在Windows上使用工具(如Notepad++、VS Code)将
activemq脚本的换行符改为LF格式; - 或者在Dockerfile中添加修复命令,在COPY后执行:
RUN sed -i 's/\r$//' ./bin/activemq
2. CPU架构不兼容
能正常运行的服务器可能是x86_64架构,而你的Windows Docker Desktop可能使用了基于ARM架构的WSL2(比如搭载M系列芯片的Mac通过Parallels运行Windows,或Windows本身安装了ARM版WSL)。ActiveMQ的bin/目录下包含架构相关的二进制依赖(如activemq-admin等辅助工具),当容器运行在非x86_64架构时,这些二进制文件无法被正确执行,会触发"文件不存在"的错误。
验证方法
进入容器后执行:
uname -m
查看容器的CPU架构,对比正常运行服务器的架构是否一致。
解决方法
- 在Windows Docker Desktop中切换到x86_64架构的WSL发行版(如Ubuntu x86_64);
- 构建镜像时指定平台,执行:
docker build --platform linux/amd64 -t 123:11 .
3. 脚本可执行权限缺失(可能性较低)
虽然Dockerfile中对/opt/activemq设置了755权限,但如果activemq脚本本身没有可执行权限(即未设置+x),也会导致执行失败。不过由于镜像在另一台服务器能正常运行,这个原因的概率较低,但可做验证。
验证方法
进入容器后执行:
ls -l ./bin/activemq
查看权限列是否包含x(如-rwxr-xr-x)。
解决方法
在Dockerfile中添加权限设置命令:
RUN chmod +x ./bin/activemq
内容的提问来源于stack exchange,提问作者DKR

