如何为Apache Camel的containerstart操作指定Docker容器ID?
Apache Camel Docker组件启动容器时容器ID缺失的解决方法
问题根源
你遇到的IllegalArgumentException: Container ID must be specified异常,是因为调用docker:containercreate创建容器后,没有把生成的容器ID传递给docker:containerstart端点。另外你写的containerstart端点URL格式有误,?parameters=是多余的,会导致参数解析错误。
修复方案
- 修正端点URL:把
docker:containerstart?host=/var/run/docker.sock?parameters=改成docker:containerstart?host=/var/run/docker.sock,去掉无效的?parameters=后缀。 - 自动传递容器ID:
docker:containercreate执行完成后,Camel会自动将新创建的容器ID存入DockerConstants.DOCKER_CONTAINER_ID请求头中,docker:containerstart端点会自动读取这个头的值,不需要额外手动设置(除非你有自定义逻辑)。
修正后的完整代码
from("kafka:new-files?brokers=localhost:9092") .setProperty("proc_vers", simple(procVers())) .setHeader(DockerConstants.DOCKER_REPOSITORY, simple("parser")) .setHeader(DockerConstants.DOCKER_TAG, simple("latest")) .setHeader(DockerConstants.DOCKER_IMAGE_ID, simple("efded01f5f75")) .setHeader(DockerConstants.DOCKER_IMAGE, simple("parser:latest")) .setHeader(DockerConstants.DOCKER_NAME, exchangeProperty("proc_vers")) .setHeader(DockerConstants.DOCKER_ENV, () -> new String []{ "MODE=xxx", "PARSER_CLIENT=xxx", "PATHS=/home/xxx/xxx" }) .setHeader(DockerConstants.DOCKER_BINDS, simple("/home/xxx:/xxx")) .to("docker:containercreate?host=/var/run/docker.sock") // 直接使用containercreate返回的容器ID,无需额外配置 .to("docker:containerstart?host=/var/run/docker.sock") .log("container started") .log("container end");
额外说明
如果因为某些原因需要显式传递容器ID(比如中间有其他逻辑修改了头信息),可以在containercreate之后添加一步,确保容器ID头存在:
.to("docker:containercreate?host=/var/run/docker.sock") // 显式保留容器ID头(可选,默认组件会自动处理) .setHeader(DockerConstants.DOCKER_CONTAINER_ID, header(DockerConstants.DOCKER_CONTAINER_ID)) .to("docker:containerstart?host=/var/run/docker.sock")
内容的提问来源于stack exchange,提问作者KotNaBalu
相关产品推荐
相关产品推荐

