TestContainers固定容器端口
· 2 min read
这篇文章的内容发生的背景和测试java
的ldap
的failover
有关.
测试failover
需要启动两个ldap
的容器并stop
其中一个.
但是stop
完之后遇到了一个问题当下次启动后分配的端口会变化(这是由于docker
的内部机制导致的).
接下来将会介绍如何解决这个问题.
这篇文章的内容发生的背景和测试java
的ldap
的failover
有关.
测试failover
需要启动两个ldap
的容器并stop
其中一个.
但是stop
完之后遇到了一个问题当下次启动后分配的端口会变化(这是由于docker
的内部机制导致的).
接下来将会介绍如何解决这个问题.
在使用TestContainers
启动容器时, 可能会存在容器之间依赖的情况.
如果其中一个容器依赖于另外一个容器, 那么需要在启动被依赖的容器时, 指定hostname
.
这样有依赖需求的容器可以直接通过hostname
来访问被依赖的容器.
以便于被依赖的容器能够正确的解析依赖容器的hostname
.
下面将介绍如何在TestContainers
中实现配置的容器hostname
以解决容器之间访问问题.
在docker registry
配置了认证后, 项目中CICD
中运行的test case
失败, 错误日志如下
Caused by: org.testcontainers.containers.ContainerFetchException: Can't get Docker image: RemoteDockerImage(imageName=hub.fastonetech.com/cce/fastone-auditing:latest, imagePullPolicy=AlwaysPullPolicy(), imageNameSubstitutor=org.testcontainers.utility.ImageNameSubstitutor$LogWrappedImageNameSubstitutor@3b68a50c)
at app//org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1371)
at app//org.testcontainers.containers.GenericContainer.logger(GenericContainer.java:651)
at app//org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:331)
... 153 more
Caused by: org.testcontainers.containers.ContainerFetchException: Failed to pull image: hub.fastonetech.com/cce/fastone-auditing:latest
at app//org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:119)
at app//org.testcontainers.images.RemoteDockerImage.resolve(RemoteDockerImage.java:28)
at app//org.testcontainers.utility.LazyFuture.getResolvedValue(LazyFuture.java:17)
at app//org.testcontainers.utility.LazyFuture.get(LazyFuture.java:39)
at app//org.testcontainers.containers.GenericContainer.getDockerImageName(GenericContainer.java:1369)
... 155 more
Caused by: com.github.dockerjava.api.exception.InternalServerErrorException: Status 500: {"message":"unauthorized: unauthorized to access repository: cce/fastone-auditing, action: pull: unauthorized to access repository: cce/fastone-auditing, action: pull"}
at app//org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:247)
at app//org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.lambda$executeAndStream$1(DefaultInvocationBuilder.java:269)
at java.base@17.0.1/java.lang.Thread.run(Thread.java:833)
TestContainers
启动完容器后客户端连接报错
feign.RetryableException: Connection reset executing GET http://localhost:32772/javers/api/v1/snapshots?page=0&size=1&sort=commitMetadata.id%2CDESC
关键cause
如下
Caused by: java.net.SocketException: Connection reset
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at feign.httpclient.ApacheHttpClient.execute(ApacheHttpClient.java:81)
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:121)
... 101 more