4 回答

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

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

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
這引導(dǎo)我找到解決方案。這是缺少 WaitStrategy 和端口映射問(wèn)題的結(jié)合。
這是我所做的:1)在 MyPop3Server.listenToPort(String port) 方法中,我添加了一個(gè) System.out.println:
public class MyPop3Server {
public void listenToPort(String port) {
//simplified: do initialization and listenToPort
System.out.println("Awaiting Connection...");
}
}
在我的測(cè)試中,我添加了一個(gè) LogMessageWaitStrategy 來(lái)偵聽(tīng)“等待連接”
GenericContainer container = new GenericContainer<>("immerfroehlich/emailfilter:latest")
.waitingFor(Wait.forLogMessage("Awaiting Connection.*", 1))
.withExposedPorts(24999);
2)我從container.getFirstMappedPort()切換到
container.getMappedPort(24999);
這是整個(gè)更改后的工作測(cè)試代碼:
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貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
試試container.getMappedPort(24999)
吧getFirstMappedPort
??赡苣?docker 映像公開了幾個(gè)端口。
添加回答
舉報(bào)