gpt4 book ai didi

testcontainers - 如何重启 testcontainers 容器?

转载 作者:行者123 更新时间:2023-12-05 06:55:45 27 4
gpt4 key购买 nike

我有服务器和客户端应用程序。服务器在 docker 容器内启动。我想测试服务器崩溃并恢复的场景。客户端在崩溃前连接到服务器,并在服务器恢复时自动连接到服务器。问题是测试容器随机映射端口,服务器回来后监听不同的端口。

我使用 org.testcontainers.containers.GenericContainer#withExposedPorts 方法来公开端口。我使用以下代码终止并启动容器:

container.getDockerClient()
.killContainerCmd( container.getContainerId() )
.exec();
container.getDockerClient()
.startContainerCmd( container.getContainerId() )
.exec();

container.stop();
container.start();

我尝试设置端口绑定(bind),但它不起作用。

setBinding(container)
container.getDockerClient()
.killContainerCmd( container.getContainerId() )
.exec();
container.getDockerClient()
.startContainerCmd( container.getContainerId() )
.exec();
...
private void setBinding( GenericContainer aContainer )
{
List< Integer > exposedPorts = aContainer.getExposedPorts();
List< String > bindings = new ArrayList<>();
exposedPorts.forEach( e -> bindings.add( aContainer.getMappedPort( e ) + ":" + e ) );
aContainer.setPortBindings( bindings );
}

如何杀死并重新启动容器?我想指出,我不想启动具有相同端口映射的其他容器。我想用相同的端口映射启动同一个容器。

最佳答案

我找到了一个解决方案:

  1. 使用(docker通过 dockerClient)
  2. 提交
  3. 停止你的容器
  4. 将新图像名称设置为相同的容器对象
  5. 然后再次调用start方法

示例:(this 指的是一个 GenericContainer 对象)

public void restart() {
String tag = this.getContainerId();
String snapshotId = dockerClient.commitCmd(this.getContainerId())
.withRepository("tempImg")
.withTag(tag).exec();
this.stop();
this.setDockerImageName("tempImg:" + tag);
this.start();
}

一些优点:

  • 您将继续受益于 WaitStrategy(如果已定义)。
  • 临时图像将在测试结束后删除。
  • 新公开的端口将再次映射到您的 GenericContainer 对象。

关于testcontainers - 如何重启 testcontainers 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65308519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com