Nos últimos dias eu estou brincando com o WildFly Swarm e decidi fazer o deploy de uma aplicação simples com Docker. Deveria funcionar bem, ao menos é o que pensava. Construí um container com o seguinte Dockerfile e ao invés de obter uma aplicação web, tudo que eu obtive foi o erro java.net.SocketException: Protocol family unavailable.

FROM java:openjdk-8-jdk

COPY target/issues.jar /opt/issues.jar

EXPOSE 8080

CMD ["java","-jar","/opt/issues.jar"]

Por alguma razão, WildFly e Java, ambos decidiram utilizar um protocolo IPv6 na interface de rede no Docker invés da v4, então tudo que você tem que fazer é falar ao Java que deve dar preferência em utilizar o IPv4 com a seguinte configuração no seu arquivo pom.xml dentro da tag do plugin WildFly.

<plugin>
        <groupId>org.wildfly.swarm</groupId>
        <artifactId>wildfly-swarm-plugin</artifactId>
        <version>2018.2.0</version>

        <!-- ADICIONE ISTO -->
        <configuration>
          <mainClass>org.wildfly.swarm.examples.netflix.ribbon.frontend.Main</mainClass>
          <properties>
                <java.net.preferIPv4Stack>true</java.net.preferIPv4Stack>
          </properties>
        </configuration>

Outra forma de solucionar o problema, é adicionando a mesma propriedade ao comando de run no seu Dockerfile. Então, fica a seu critério onde adicionar. Abaixo a solução utilizando o Dockerfile.

FROM java:openjdk-8-jdk
ENV JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true"

COPY target/issues.jar /opt/issues.jar

EXPOSE 8080

ENTRYPOINT exec java $JAVA_OPTS -jar /opt/issues.jar


Traduções: