测试docker图像。使用exec轻松启动并获取日志

测试docker图像。使用exec轻松启动并获取日志,docker,kotlin,junit5,testcontainers,Docker,Kotlin,Junit5,Testcontainers,我为我的CI创建了一个小应用程序。这个应用非常简单,它打印到控制台属性,我设置为选项,然后退出。 我可以在cmd中执行它(我使用windows),如下所示: @Testcontainers class Test{ val dockerImageId = System.getProperty("dockerImageId ") var dockerClient = DockerClientFactory.instance().client() @Test

我为我的CI创建了一个小应用程序。这个应用非常简单,它打印到控制台属性,我设置为选项,然后退出。 我可以在cmd中执行它(我使用windows),如下所示:

@Testcontainers
class Test{

  val dockerImageId = System.getProperty("dockerImageId ")
  var dockerClient = DockerClientFactory.instance().client()

  @Test
    fun init() {
        val log = dockerClient.stratContainerFromImageId(dockerImageId).withExec("say --param \"hello world\"").getLog()
        assertEqals("hello world", log)
    }
}
dockerClient.startContainerCmd(dockerClient.createContainerCmd(dockerId).exec().id).exec()
docker run--rm myImage:latest say--param“hello world”

我在cmd中看到“你好,世界”。 现在我想在我的图像上写一个测试。我使用Kotlin作为主语言,Junit5作为测试框架,com.github.dockerjava.api.DockerClient作为Docker客户端。我想编写这样的简单测试:

@Testcontainers
class Test{

  val dockerImageId = System.getProperty("dockerImageId ")
  var dockerClient = DockerClientFactory.instance().client()

  @Test
    fun init() {
        val log = dockerClient.stratContainerFromImageId(dockerImageId).withExec("say --param \"hello world\"").getLog()
        assertEqals("hello world", log)
    }
}
dockerClient.startContainerCmd(dockerClient.createContainerCmd(dockerId).exec().id).exec()
在Dockerlient文档的糟糕夜晚之后,我可以像这样开始映像:

@Testcontainers
class Test{

  val dockerImageId = System.getProperty("dockerImageId ")
  var dockerClient = DockerClientFactory.instance().client()

  @Test
    fun init() {
        val log = dockerClient.stratContainerFromImageId(dockerImageId).withExec("say --param \"hello world\"").getLog()
        assertEqals("hello world", log)
    }
}
dockerClient.startContainerCmd(dockerClient.createContainerCmd(dockerId).exec().id).exec()
但是我打开LogContainerCmd开始学习结果Callback我想死


我在寻找简单的方法,为我的简单测试。现在怎么样?

为什么不按照文档中的建议创建一个容器作为测试类字段? 从第2节开始


然后您可以运行一个命令,然后执行
execResult.getStdout()
container.getLogs()

为什么要这样做?我想测试我的图像。现在我对代码进行了单元测试。但我现在想要的是,我的形象成功地建立和运行。它很接近!我创建
@Container var myImage=GenericContainer(dockriagename.parse(“myName”))。应用{withCreateContainerCmdModifier{it.withCmd(“say--param\'hello world\”)}
和我的测试
@test fun log(){println(“containerId:${myImage.containerId}”)println(“日志:${myImage.logs}”)println(“containerId:${myImage.containerId}”)
但控制台是
containerId:cc5e818…logs:containerId:cc5e818…
登录测试是空的!但我在docker dashbord中看到日志。这是我的错。容器需要时间来执行命令。我插入Thread.sleep(1000)并看到日志!!!!