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

如何在单个Docker容器内运行多个可执行文件

问题解决方法

Docker 单组ENTRYPOINT+CMD的配置限制,仅针对容器启动时默认执行的前台主进程,完全不影响你在单个镜像里存放多个可执行文件,也不需要构建多镜像浪费存储空间,以下两种方案都能满足你按需选择运行程序的需求:

方案1:入口脚本分发(生产环境推荐,兼容原有默认行为)

核心思路是把原来硬编码指向./Tests的入口,替换为一个极轻量的shell分发脚本,脚本根据传入的第一个参数判断要启动的可执行文件,再把后续参数透传给对应程序,零额外依赖,不增加多余镜像体积。

修改后的Dockerfile如下:

FROM gcc:11.3.0

COPY . /root/sonu
WORKDIR /root/sonu

# 合并编译层减少镜像层数,控制镜像体积
RUN g++ -o Tests tests.cpp && g++ -o Testd testd.cpp

# 直接生成入口执行脚本,无需额外拷贝本地文件
RUN echo '#!/bin/sh\ncase "$1" in\n  add)\n    shift\n    exec ./Tests "$@"\n    ;;\n  sub)\n    shift\n    exec ./Testd "$@"\n    ;;\n  *)\n    echo "参数错误,使用方式: [add|sub] <数值1> <数值2>"\n    echo "add: 执行加法计算, sub: 执行减法计算"\n    exit 1\n    ;;\nesac' > /entrypoint.sh && chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]
# 默认行为和原有配置完全一致:启动加法程序,传入参数10、3
CMD ["add", "10", "3"]

使用方式:

  • 无参数默认启动:直接执行docker run 你的镜像名,和原有逻辑完全一致,运行加法程序计算10+3
  • 运行加法自定义参数:docker run 你的镜像名 add 20 5,返回计算结果25
  • 运行减法自定义参数:docker run 你的镜像名 sub 20 5,返回计算结果15

注:你提供的testd.cpp存在笔误,减法逻辑的计算行写的是float diff =n1+n2;,实际要实现减法需要改成float diff =n1-n2;,否则减法程序输出结果和加法一致。


方案2:启动时覆盖默认入口(临时调试用,无需重新构建镜像)

如果不想重新构建镜像,可以直接在docker run命令中通过--entrypoint参数覆盖默认的入口配置,直接指定要运行的可执行文件:

  • 运行减法程序,传入参数10、3:
docker run --entrypoint ./Testd 你的镜像名 10 3
  • 运行加法程序,传入参数20、10:
docker run --entrypoint ./Tests 你的镜像名 20 10

这个方案的缺点是没有默认启动行为,每次切换程序都需要手动指定入口,仅适合临时调试场景。

避坑提醒

你的需求是启动时二选其一运行单个程序,不需要引入supervisord、s6-overlay这类多进程管理工具,这类工具是用来在容器内同时启动多个常驻进程的,引入后会平白增加镜像体积和维护成本,完全没必要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:48:33