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

Posted

技术标签:

【中文标题】测试泊坞窗图像。使用 exec 轻松启动并获取日志【英文标题】:Testing docker image. Easy start with exec and get log 【发布时间】:2021-02-24 10:41:54 【问题描述】:

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

docker run --rm myImage:latest say --param "hello world"

我在 cmd 中看到“hello world”。 现在我想在我的图像上写测试。我使用 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 文档的糟糕夜晚之后,我可以像这样启动图像:

dockerClient.startContainerCmd(dockerClient.createContainerCmd(dockerId).exec().id).exec()

但是当我打开 LogContainerCmd 并开始学习 ResultCallback 我想死!

我正在寻找简单的方法,用于我的简单测试。现在怎么样了?

【问题讨论】:

为什么要这样做? 我想测试我的形象。现在我对代码进行了单元测试。但我现在想要的是,我的图像可以快速构建并运行。 【参考方案1】:

为什么不按照文档中的建议创建一个容器作为测试类字段? https://www.testcontainers.org/quickstart/junit_5_quickstart/从第2节开始

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

【讨论】:

很接近了!我创建@Container var myImage = GenericContainer<Nothing>(DockerImageName.parse("myName")).apply withCreateContainerCmdModifier it.withCmd("say --param \"hello world\"") 和我的测试@Test fun log() println("containerId: $myImage.containerId") println("logs: $myImage.logs") println("containerId: $myImage.containerId") 但控制台是containerId: cc5e818... logs: containerId: cc5e818... 登录测试为空!但我在我的 docker dashbord 中看到了日志。 这是我的错。容器需要时间来执行命令。我插入 Thread.sleep(1000) 我看到了日志!!!

以上是关于测试泊坞窗图像。使用 exec 轻松启动并获取日志的主要内容,如果未能解决你的问题,请参考以下文章

使用多阶段泊坞窗文件输出多个图像

从容器内部构建并推送泊坞窗图像

sh Coursera DL使用泊坞窗图像

sh 删除摇晃的泊坞窗图像

sh 删除所有泊坞窗图像

Nvidia Theano 泊坞窗图像不可用