Не получается связать порт контейнера с портом компьютера
Хочу провести тестирование контейнера при помощи GenericContainer
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<version>1.17.4</version>
<scope>test</scope>
</dependency>
Мною заранее был создан образ:
FROM openjdk:8-jdk-alpine
EXPOSE 8080
ADD target/MySpringBoot-0.0.1-SNAPSHOT.jar myapp.jar
ENTRYPOINT ["java","-jar","/myapp.jar"]
docker build -t devapp .
Теперь, я используя GenericContainer собираюсь запустить контейнер со своим образом
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class MySpringBootApplicationTests {
public static GenericContainer<?> firstContainer = new GenericContainer<>("devapp");
@Autowired
TestRestTemplate restTemplate;
@BeforeAll
public static void setUp() {
firstContainer.start();
// secondContainer.start();
}
@Test
void firstImage() {
int first = firstContainer.getMappedPort(8080);
ResponseEntity<?> responseEntity = restTemplate.getForEntity("http://localhost:" + first + "/profile", String.class);
System.out.println(responseEntity.getBody());
}
но, строка
int first = firstContainer.getMappedPort(8080);
выбрасывает исключение
java.lang.IllegalArgumentException: Requested port (8080) is not mapped
При том, что если я вручную создам и подниму контейнер с этим же образом
docker run -d --name firstContainer -P devapp
все срабатывает корректно С чем это все может быть связано?
ps: Интересно, что когда использовал зависимость для testcontainer не 1.17.4, а 1.15.1, привязывание порта к контейнеру проходило успешно(firstContainer.getMappedPort(8080), но получал ошибку при непосредственной отправки get запроса
restTemplate.getForEntity("http://localhost:" + first + "/profile", String.class)
Ошибка была такая:
I/O error on GET request for http//localhost:8080/profile
Но, когда включал режим дебага (при тестировании) и построчно дебажил, запрос проходил успешно, и все работало.
Ответы (1 шт):
Инструкция EXPOSE чисто декоративная:
The EXPOSE instruction does not actually publish the port. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.
Поэтому вам нужно явно указывать порт при создании контейнера:
new GenericContainer<>("devapp").withExposedPorts(8080)