【问题标题】:How to copy a file from a container to another container using TestContainers?如何使用 TestContainers 将文件从容器复制到另一个容器?
【发布时间】:2022-06-15 16:45:28
【问题描述】:

我使用 TestContainers 进行集成测试。目前,我在启动测试容器时使用withCopyFileToContainer(MountableFile.forClassPathResource(...))将一些文件从主机复制到测试容器(因此测试所在的服务打包在jar中并在主机上本地运行,jar本身包含一些需要复制到从测试启动的测试容器的文件)。当包含测试的服务本身被容器化时,这不起作用(因此包含文件的jar 文件在容器中启动,可以通过 docker 套接字访问主机 docker,并启动一些文件的新测试容器需要复制)。我假设测试容器无法将文件从容器复制到另一个容器。解决办法是什么?

  1. 我是否应该实现Transferable 接口并提供transferTo 方法的实现?
  2. 我应该使用某种卷吗? 欢迎提出任何想法。

【问题讨论】:

    标签: java integration-testing junit5 testcontainers testcontainers-junit5


    【解决方案1】:

    也许在主机和容器之间(以及在容器之间)共享文件的最实用方法是使用您在选项 2 中指出的挂载卷。

    以下是从主机上安装卷到容器的示例:

    return new GenericContainer<>("castlemock/castlemock:v1.63").withExposedPorts(8080).withCreateContainerCmdModifier(
        cmd -> cmd.withHostConfig(
                new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(28080), new ExposedPort(8080))))
            .withBinds(
                Bind.parse(Paths.get(".", "container_shares/castlemock").toAbsolutePath() + ":/root/.castlemock")));
    

    在这种情况下,它是从路径“/root/.castlemock”中的容器上的主机安装文件夹“./container_shares/castlemock”(其中“.”表示项目的基本目录)。

    您可以通过挂载相同的“主机”目录来在容器之间共享文件。

    【讨论】:

    • 使用主机卷挂载的跨环境移植性要差得多,因此通常不鼓励。
    【解决方案2】:

    对于您的用例,您可能需要退回到直接与 docker-java 交互,使用 withCreateContainerCmdModifier 附加一个可以在容器之间共享的命名卷(不是绑定挂载)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-01
      • 2020-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2015-07-16
      • 2020-12-06
      相关资源
      最近更新 更多