簡體   English   中英

從 Java 應用程序在容器內執行 docker 命令

[英]Execute docker command inside container from Java application

我在容器中運行 Kafka,希望能夠運行一個簡單的命令來更改 Java 應用程序(Spring-Boot)中某個主題的分區數。

我已經嘗試過使用 ProcessBuilder,但是從我讀到的任何錯誤消息來看,我無法通過 processbuilder 來完成。

相反,我試圖查看 Docker API,但無法理解/找到任何解決方案。

我想做什么:運行:docker exec -it kafka bash,然后在 Kafka 容器內運行:./bin/kafka-topics.sh --alter --zookeeper zookeeper:2181 --topic topicName --partitions 5

他們是一種簡單的方法嗎?

卡夫卡在哪里運行與問題無關。 您只需要它是可解析的(使用引導服務器,而不是棄用的 Zookeeper 配置)

shell 腳本只是現有 Java 類的包裝器,您可以在自己的 Java 代碼中導入和調用這些類,因此您不應使用 ProcessBuilder 或docker exec 使用 Spring-Kafka 時,您還可以嘗試在 Spring 配置中為 NewTopic 定義@Bean ,但我不確定更改配置中的分區計數是否會實際發送更改請求或忽略現有主題的更改。

請記住,您不應修改正在主動接收數據的主題的分區計數,因此請先停止現有的生產者和消費者。

解決方案由@David Maze 帶來

您應該能夠使用 Kafka 管理 API 來執行此操作。 您不需要執行命令,不需要像 docker exec 這樣的調試工具來執行它,也不需要 Docker 訪問將提供的不受限制的根級權限。 ——大衛迷宮

它起到了魅力的作用! 謝謝!

我不需要添加更多:

public static void changePartitions(String topicName, int numPartitions) {
    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9094");
    AdminClient adminClient = AdminClient.create(props);

    Map<String, NewPartitions> newPartitionSet = new HashMap<>();
    newPartitionSet.put(topicName, NewPartitions.increaseTo(numPartitions));
    adminClient.createPartitions(newPartitionSet);
    adminClient.close();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM