4 回答

TA貢獻1856條經驗 獲得超5個贊
其他答案中有一些很好的建議;我將用其他一些技巧來補充這些內容:
正如已經建議的:
絕對要添加,
LogConsumer
以便您可以看到容器的日志輸出 - 也許現在或將來會出現一些有用的東西。擁有它總是好的。在容器啟動后、啟動客戶端之前設置斷點。
此外,我希望以下事情能夠有所作為。在斷點處暫停時:
docker ps -a
在終端中運行首先,檢查您的容器是否正在運行并且尚未退出。如果它已退出,請從終端查看容器的日志。
其次,檢查輸出中的端口映射
docker ps
。您應該看到類似的內容0.0.0.0:32768->24999/tcp
(盡管第一個端口號是隨機的)。在您的 IDE 中進行評估
container.getFirstMappedPort()
并檢查您返回的端口號是否與隨機公開的端口相同。除非您在本地計算機上安裝了非常不尋常的 Docker,否則應該可以通過localhost:
+ 此端口訪問此容器。如果您已經走到這一步,那么容器或客戶端代碼可能有問題。
nc
您可以嘗試將不同的客戶端連接到正在運行的容器 -如果您手邊沒有另一個 POP3 客戶端,甚至類似的操作也會有所幫助。
另一件可以嘗試的事情是手動運行容器,只是為了減少發生的間接數量。您給出的 Testcontainers 代碼片段相當于:
docker run -p 24999 immerfroehlich/emailfilter:latest
您可能會發現這可以幫助您將問題空間劃分為更小的部分。

TA貢獻1824條經驗 獲得超6個贊
嘗試添加 http 檢查。
new GenericContainer<>("immerfroehlich/emailfilter:latest") .withExposedPorts(24999) .waitingFor(new HttpWaitStrategy().forPort(24999) .withStartupTimeout(Duration.ofMinutes(5)));
您的容器可能已啟動,但您嘗試在服務器初始化之前進行連接。
另外,注冊一個日志附加程序以查看容器內服務器的運行情況。
.withLogConsumer(new Slf4jLogConsumer(LoggerFactory.getLogger( DockerPop3AutocryptKeyProvidingAndReceivingTest.class)))

TA貢獻1812條經驗 獲得超5個贊
這引導我找到解決方案。這是缺少 WaitStrategy 和端口映射問題的結合。
這是我所做的:1)在 MyPop3Server.listenToPort(String port) 方法中,我添加了一個 System.out.println:
public class MyPop3Server {
public void listenToPort(String port) {
//simplified: do initialization and listenToPort
System.out.println("Awaiting Connection...");
}
}
在我的測試中,我添加了一個 LogMessageWaitStrategy 來偵聽“等待連接”
GenericContainer container = new GenericContainer<>("immerfroehlich/emailfilter:latest")
.waitingFor(Wait.forLogMessage("Awaiting Connection.*", 1))
.withExposedPorts(24999);
2)我從container.getFirstMappedPort()切換到
container.getMappedPort(24999);
這是整個更改后的工作測試代碼:
public class DockerPop3AutocryptKeyProvidingAndReceivingTest {
@Test
public void test() throws InterruptedException {
GenericContainer container = new GenericContainer<>("immerfroehlich/emailfilter:latest")
.waitingFor(Wait.forLogMessage("Awaiting Connection.*", 1))
.withExposedPorts(24999);
container.start();
String host = container.getContainerIpAddress();
String port = container.getMappedPort(24999).toString();
//The following is simplified, but copied from the working jar used in the Docker Client image/container
MyPOP3Client client = new MyPOP3Client(host, port);
client.connect();
container.stop();
}
}

TA貢獻1773條經驗 獲得超3個贊
試試container.getMappedPort(24999)
吧getFirstMappedPort
。可能您的 docker 映像公開了幾個端口。
添加回答
舉報