Docker运行C++ Web服务器时出现exec格式错误求助
解决Docker运行C++二进制文件的exec format error问题
问题原因
exec format error本质是二进制文件的CPU架构与Docker容器的架构不兼容。比如你在ARM64架构的机器(如M系列Mac)上本地编译了二进制,而gcc:7.3.0镜像是x86_64架构,直接挂载到容器里运行就会出现格式不匹配的错误。另外你本地编译时的依赖环境也可能和容器内不一致,导致运行失败。
解决方案
方案1:在Docker容器内完成编译(推荐)
将代码复制到容器内部,在容器环境中完成编译,确保二进制和容器架构完全匹配:
修改你的Dockerfile如下:
FROM gcc:7.3.0 RUN apt-get -qq update RUN apt-get -qq upgrade RUN apt-get -qq install cmake RUN apt-get -qq install libboost-all-dev=1.62.0.1 RUN apt-get -qq install build-essential libtcmalloc-minimal4 && \ # 修正原Dockerfile中的路径错误:/user -> /usr ln -s /usr/lib/libtcmalloc_minimal.so.4 /usr/lib/libtcmalloc_minimal.so # 创建项目工作目录 WORKDIR /usr/src/cppweb/hello_crow # 复制本地项目文件到容器内 COPY . . # 执行编译步骤 RUN mkdir -p build && cd build && cmake .. && make
然后重新构建镜像:
docker build -t cppbox:latest .
运行容器时无需挂载本地目录,直接执行容器内编译好的二进制:
docker run -p 8080:8080 -e PORT=8080 cppbox:latest /usr/src/cppweb/hello_crow/build/hello_crow
方案2:强制指定容器架构(适配ARM64机器)
如果你坚持本地编译后挂载到容器,需要让容器和本地编译的架构一致。比如ARM64机器上运行x86_64容器:
构建镜像时指定平台:
docker build --platform linux/amd64 -t cppbox:latest .
运行容器时同样指定平台:
docker run --platform linux/amd64 -v /Users/arveanlabib/Desktop/cppweb:/usr/src/cppweb -p 8080:8080 -e PORT=8080 cppbox:latest /usr/src/cppweb/hello_crow/build/hello_crow
注意:这种方式会通过QEMU模拟x86_64架构,性能会有所下降,优先推荐方案1。
内容的提问来源于stack exchange,提问作者user19394369
相关产品推荐
相关产品推荐

