Контейнеры теста, Docker в Docker с пользовательской сетью, Контейнеры не принадлежат сети - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь заставить Testcontainers работать в TeamCity с использованием образа компоновщика Docker.

Тест выполняется нормально локально (не внутри образа компоновщика). И только частично в образе строителя на TeamCity. Я следовал руководству на DinD , но нет примеров того, как сеть docker вступает в игру.

То, как мы начинаем сборку в TeamCity (обратите внимание на параметр --network, ryuk отключен, так как у него были проблемы с подключением):

docker network create --driver bridge custom_network

docker run --rm -it -v $PWD:$PWD -w $PWD \
  --privileged \
  --network=custom_network \
  -e TESTCONTAINERS_RYUK_DISABLED=true \
  -e _JAVA_OPTIONS="" \
  -e DOCKER_HOST="unix:///var/run/docker.sock" \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /home/teamcity/.docker:/home/java/.docker
  -v /local/maven/cache/repository:/opt/m2/repository \
  registry.ch/java:11-builder \
  mvn verify

Сборка работает вполне нормально: запускается тест junit, загружается пользовательский образ oracle -xe, который мы используем, и журнал предполагает, что он запущен , Но локально я вижу, что testcontainers опрашивает создание соединения, в TeamCity сборка просто продолжается и выдает ошибку:

[14:01:07] :     [Step 3/3] 14:01:07.006 [tc-okhttp-stream-276714561] DEBUG com.github.dockerjava.core.command.PullImageResultCallback - ResponseItem(stream=null, status=Extracting, progressDetail=ResponseItem.ProgressDetail(current=625569807, total=625569807, start=null), progress=[==================================================>]  625.6MB/625.6MB, id=2538d1d7e815, from=null, time=null, errorDetail=null, error=null, aux=null)
[14:01:07] :     [Step 3/3] 14:01:07.211 [tc-okhttp-stream-276714561] DEBUG com.github.dockerjava.core.command.PullImageResultCallback - ResponseItem(stream=null, status=Pull complete, progressDetail=ResponseItem.ProgressDetail(current=null, total=null, start=null), progress=null, id=2538d1d7e815, from=null, time=null, errorDetail=null, error=null, aux=null)
...
[14:01:07] :     [Step 3/3] 14:01:07.228 [tc-okhttp-stream-276714561] INFO    [registry/private/oracle/database:18c_xe] - Pull complete. 2 layers, pulled in 46s (downloaded 637 MB at 13 MB/s)
[14:01:07] :     [Step 3/3] 14:01:07.228 [main] DEBUG com.github.dockerjava.core.command.AbstrDockerCmd - Cmd: registry/private/oracle/database:18c_xe
...
[14:01:07]i:     [Step 3/3] Docker event: {"status":"pull","id":"registry/private/oracle/database:18c_xe","Type":"image","Action":"pull","Actor":{"ID":"registry/private/oracle/database:18c_xe","Attributes":{"name":"registry/private/oracle/database"}},"scope":"local","time":1588075267,"timeNano":1588075267227817791}
...
[14:01:08] :     [Step 3/3]  :: Spring Boot ::        (v2.2.6.RELEASE)
[14:01:08] :     [Step 3/3] 
[14:01:08] :     [Step 3/3] 2020-04-28 14:01:08.502 ERROR 47 --- [           main] o.s.boot.SpringApplication               : Application run failed
[14:01:08] :     [Step 3/3] 
[14:01:08] :     [Step 3/3] java.lang.IllegalStateException: Mapped port can only be obtained after the container is started
[14:01:08] :     [Step 3/3]     at org.testcontainers.shaded.com.google.common.base.Preconditions.checkState(Preconditions.java:174) ~[testcontainers-1.14.1.jar:na]
[14:01:08] :     [Step 3/3]     at org.testcontainers.containers.ContainerState.getMappedPort(ContainerState.java:129) ~[testcontainers-1.14.1.jar:na]
[14:01:08] :     [Step 3/3]     at org.testcontainers.containers.OracleContainer.getOraclePort(OracleContainer.java:95) ~[oracle-xe-1.14.1.jar:na]
[14:01:08] :     [Step 3/3]     at org.testcontainers.containers.OracleContainer.getJdbcUrl(OracleContainer.java:64) ~[oracle-xe-1.14.1.jar:na]
[14:01:08] :     [Step 3/3]     at ch.package.OracleFlywayDatabaseTest$Initializer.initialize(OracleFlywayDatabaseTest.java:35) ~[test-classes/:na]
[14:01:08] :     [Step 3/3]     at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:626) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
...
[14:01:08] :     [Step 3/3]     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) ~[junit-platform-launcher-1.3.1.jar:1.3.1]
...
[14:01:08] :     [Step 3/3]     at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418) ~[surefire-booter-2.22.2.jar:2.22.2]
[14:01:08] :     [Step 3/3] 
...
[14:01:08] :     [Step 3/3] org.testcontainers.containers.ContainerLaunchException: Container startup failed
[14:01:08] :     [Step 3/3] Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=registry/private/oracle/database:18c_xe, imagePullPolicy=DefaultPullPolicy())
[14:01:08] :     [Step 3/3] Caused by: java.time.format.DateTimeParseException: Text '2020-03-04T15:17:25.025952651+01:00' could not be parsed at index 29
[14:01:08] :     [Step 3/3] 

Я не уверен насчет последнего исключения, похоже, Плохо, проблема в том, что контейнер oracle, который мы запускаем, «не виден». Дата в этом DateTimeParseException является датой создания нашего oracle -xe образа в нашем реестре.

Я попытался создать контейнер также с опцией withNetwork в сборщике:

@Testcontainers
public abstract class OracleFlywayDatabaseTest {

  @Container
  private static final OracleContainer oracle =
        new OracleContainer("registry/private/oracle/database:18c_xe")
                // .withNetwork(Network.builder().id("custom_network").build())
                .withUsername("TESTUSR")
                .withPassword("TESTPWD");

Если я исследую это локально с помощью docker network inspect custom_network контейнера базы данных, запущенного Testcontainers, нет в этой сети.

Как правильно поместить контейнер в эту сеть? Имеется в виду та же сеть, в которой изначально создается образ строителя? Действительно ли id идентификатор, который docker назначает сети при его создании? (Я пытался это сделать, но, возможно, я делал что-то не так).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...