testcontainers / testcontainers/testcontainers-java

ImageFromDockerfile(dockerImageName, deleteOnExit) failing to build container doesn't error usefully

Aperta
#3,713 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Lingua principale
Java
Stelle
8.7k
Fork
1.9k
Merge medio
2g 17h
PR unite (30g)
9

Descrizione

I spent a couple of hours this morning chasing down an issue where a developer was able to use ImageFromDockerfile to build an image locally but it was failing in CI and on other machines despite running docker system prune -a on their machine to clear any possible cached images.

The stacktrace showed it oddly attempting to pull the image from Docker Hub and it failing because it doesn't exist there:

Container startup failed
org.testcontainers.containers.ContainerLaunchException: Container startup failed
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:330)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:311)
	at com.cloudnc.schedulesolver.services.integration.IntegrationTest.beforeSpec(IntegrationTest.kt:46)
	at io.kotlintest.runner.jvm.spec.SpecRunner.executeBeforeSpec(SpecRunner.kt:40)
	at io.kotlintest.runner.jvm.spec.SpecRunner.interceptSpec(SpecRunner.kt:26)
	at io.kotlintest.runner.jvm.spec.SpecRunner.interceptSpec(SpecRunner.kt:53)
	at io.kotlintest.runner.jvm.spec.SingleInstanceSpecRunner$execute$1.invokeSuspend(SingleInstanceSpecRunner.kt:53)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:86)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:61)
	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt)
	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
	at io.kotlintest.runner.jvm.spec.SingleInstanceSpecRunner.execute(SingleInstanceSpecRunner.kt:52)
	at io.kotlintest.runner.jvm.spec.SpecExecutor$execute$$inlined$invoke$lambda$1.invoke(SpecExecutor.kt:54)
	at io.kotlintest.runner.jvm.spec.SpecExecutor$execute$$inlined$invoke$lambda$1.invoke(SpecExecutor.kt:20)
	at io.kotlintest.runner.jvm.spec.SpecExecutor.withExecutor(SpecExecutor.kt:31)
	at io.kotlintest.runner.jvm.spec.SpecExecutor.execute(SpecExecutor.kt:37)
	at io.kotlintest.runner.jvm.TestEngine$submitSpec$1.run(TestEngine.kt:111)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=test/schedule-service:latest, imagePullPolicy=DefaultPullPolicy())
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1286)
	at org.testcontainers.containers.GenericContainer.logger(GenericContainer.java:615)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:320)
	... 25 more
Caused by: com.github.dockerjava.api.exception.NotFoundException: Status 404: {"message":"pull access denied for test/schedule-service, repository does not exist or may require 'docker login': denied: requested access to the resource is denied"}
	at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:241)
	at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.lambda$executeAndStream$1(DefaultInvocationBuilder.java:269)
	... 1 more
com.cloudnc.schedulesolver.services.integration.IntegrationTest > initializationError FAILED
    org.testcontainers.containers.ContainerLaunchException at IntegrationTest.kt:46
        Caused by: org.testcontainers.containers.ContainerFetchException at IntegrationTest.kt:46
            Caused by: com.github.dockerjava.api.exception.NotFoundException at DefaultInvocationBuilder.java:241

When I removed the dockerImageName and deleteOnExit arguments from the method then it gave me a much more useful error which showed the problem:

Container startup failed
org.testcontainers.containers.ContainerLaunchException: Container startup failed
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:330)
	at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:311)
	at com.cloudnc.schedulesolver.services.integration.IntegrationTest.beforeSpec(IntegrationTest.kt:46)
	at io.kotlintest.runner.jvm.spec.SpecRunner.executeBeforeSpec(SpecRunner.kt:40)
	at io.kotlintest.runner.jvm.spec.SpecRunner.interceptSpec(SpecRunner.kt:26)
	at io.kotlintest.runner.jvm.spec.SpecRunner.interceptSpec(SpecRunner.kt:53)
	at io.kotlintest.runner.jvm.spec.SingleInstanceSpecRunner$execute$1.invokeSuspend(SingleInstanceSpecRunner.kt:53)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
	at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:274)
	at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:86)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:61)
	at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
	at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt)
	at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)
	at io.kotlintest.runner.jvm.spec.SingleInstanceSpecRunner.execute(SingleInstanceSpecRunner.kt:52)
	at io.kotlintest.runner.jvm.spec.SpecExecutor$execute$$inlined$invoke$lambda$1.invoke(SpecExecutor.kt:54)
	at io.kotlintest.runner.jvm.spec.SpecExecutor$execute$$inlined$invoke$lambda$1.invoke(SpecExecutor.kt:20)
	at io.kotlintest.runner.jvm.spec.SpecExecutor.withExecutor(SpecExecutor.kt:31)
	at io.kotlintest.runner.jvm.spec.SpecExecutor.execute(SpecExecutor.kt:37)
	at io.kotlintest.runner.jvm.TestEngine$submitSpec$1.run(TestEngine.kt:111)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=<resolving>, imagePullPolicy=DefaultPullPolicy())
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1286)
	at org.testcontainers.containers.GenericContainer.logger(GenericContainer.java:615)
	at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:320)
	... 25 more
Caused by: com.github.dockerjava.api.exception.DockerClientException: Could not build image: COPY failed: file not found in build context or excluded by .dockerignore: stat build/libs/schedule-solver-app.jar: file does not exist
	at com.github.dockerjava.api.command.BuildImageResultCallback.getImageId(BuildImageResultCallback.java:78)
	at com.github.dockerjava.api.command.BuildImageResultCallback.awaitImageId(BuildImageResultCallback.java:50)
	at org.testcontainers.images.builder.ImageFromDockerfile.resolve(ImageFromDockerfile.java:141)
	at org.testcontainers.images.builder.ImageFromDockerfile.resolve(ImageFromDockerfile.java:37)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:17)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:39)
	at org.testcontainers.shaded.com.google.common.util.concurrent.Futures$3.get(Futures.java:1332)
	at org.testcontainers.images.RemoteDockerImage.getImageName(RemoteDockerImage.java:104)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:63)
	at org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:27)
	at org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:17)
	at org.testcontainers.utility.LazyFuture.get(LazyFuture.java:39)
	at org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1284)
	... 27 more

The Dockerfile is attempting to copy in a jar that should have been built in an earlier step but was missed. It worked on the developer's local machine because they had the jar already built.

I'm not sure why passing the dockerImageName and deleteOnExit arguments to the method causes it to fail quietly and then attempt to run the image and so fetch from Docker Hub while the argumentless version gives me the more useful error message here?

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con il percorso di ImageFromDockerfile.resolve e GenericContainer.getDockerImageName/RemoteDockerImage mostrato nel trace; confrontalo con il percorso senza argomenti. Riproduci il caso in cui manca build/libs/schedule-solver-app.jar con dockerImageName e deleteOnExit, quindi assicurati che l’errore sottostante della Docker build rimanga visibile invece di attivare un pull di test/schedule-service:latest.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
docker, java
Ambito
testing
Tipo di issue
Bug
Difficoltà
3/5
Tempo stimato
1-2 giorni
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.