Maven, Docker получить фактический IP-адрес хост-системы

С помощью Maven и docker-maven-plugin я настроил контейнеры Apache Kafka + ZooKeeper:

<image>
    <name>wurstmeister/zookeeper:${zookeeper.version}</name>
    <alias>zookeeper</alias>
    <run>
        <ports>
            <port>${zookeeper.port}:2181</port>
        </ports>
    </run>
</image>

<image>
    <name>wurstmeister/kafka:${kafka.version}</name>
    <alias>kafka</alias>
    <run>
        <ports>
            <port>9093:9092</port>
        </ports>
        <links>
            <link>zookeeper:zookeeper</link>
        </links>
        <env>
            <KAFKA_ADVERTISED_HOST_NAME>192.168.1.202</KAFKA_ADVERTISED_HOST_NAME>
            <KAFKA_ADVERTISED_PORT>9093</KAFKA_ADVERTISED_PORT>
            <KAFKA_ZOOKEEPER_CONNECT>zookeeper:${zookeeper.port}</KAFKA_ZOOKEEPER_CONNECT>
        </env>
    </run>
</image>

Как вы можете видеть, чтобы заставить его работать, я должен предоставить фактический IP-адрес моей хост-системы:

<KAFKA_ADVERTISED_HOST_NAME>192.168.1.202</KAFKA_ADVERTISED_HOST_NAME>

Есть ли способ в Maven или Docker- Maven -плагин, чтобы получить этот IP-адрес автоматически без необходимости его жесткого кодирования?

ОБНОВЛЕНО

Я нашел плагин, который позволяет мне получить IP-адрес хоста:

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>get-local-ip</id>
                    <goals>
                        <goal>local-ip</goal>
                    </goals>
                    <configuration>
                        <localIpProperty>local.ip</localIpProperty>
                    </configuration>
                </execution>
            </executions>
        </plugin>

но для того, чтобы использовать его мне нужно выполнить build-helper:local-ip Цель перед остальными командами Maven:

mvn build-helper:local-ip docker:start

Как связать этот плагин с некоторой фазой / целью, чтобы автоматически вызывать его на некоторой ранней фазе инициализации без необходимости вызова build-helper:local-ip каждый раз вручную?

1 ответ

Решение

Из документации для build-helper-maven-plugin:

По умолчанию привязывается к фазе жизненного цикла: process-test-classes

Вы можете изменить его, чтобы привязать к любой фазе, которую вы хотите, например,

            <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>local-ip</goal>
                    </goals>
                    <phase>initialize</phase>
                </execution>
            </executions>
        </plugin>

В local-ip только из build-helper-maven-plugin возвращается 127.0.0.1.

В моем случае был необходим сетевой адрес - что-то вроде 192.168.17.112.

<plugin>
    <groupId>org.codehaus.groovy.maven</groupId>
    <artifactId>gmaven-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <source>
                    java.net.DatagramSocket socket = new java.net.DatagramSocket()
                    socket.connect(java.net.InetAddress.getByName('google.com'), 80)
                    project.properties['host.address'] = socket.getLocalAddress().getHostAddress()
                </source>
            </configuration>
        </execution>
    </executions>
</plugin>

Недвижимость host.address затем содержит желаемый сетевой IP-адрес.

(Не голосуйте за меня, а за ответ, который мне помог: получение IP-адреса текущей машины с помощью Java)

Другие вопросы по тегам