我已经使用testcontainer创建了一个Postgres实例。容器启动,但是我无法访问它。
我尝试使用DBeaver连接到容器化的DB。 在eclipse控制台中,一切似乎都很好:
01:29:34.662 [main]调试com.github.dockerjava.core.command.AbstrDockerCmd-Cmd:com.github.dockerjava.core.command.CreateContainerCmdImpl@73386d72 [name =,hostName =,domainName =,user =,attachStdin =,attachStdout =,attachStderr =,portSpecs =,tty =,stdinOpen =,stdInOnce =,env = {POSTGRES_USER = test,POSTGRES_PASSWORD = test,POSTGRES_DB = ASIGDB_TEST}
这是我的代码:
public class CustomPostgresContainer extends PostgreSQLContainer<CustomPostgresContainer>{
private static final String IMAGE_VERSION = "postgres:9.6";
private static CustomPostgresContainer customPostgresContainer;
private static final int EXPOSED_PORT = 5555;
private static final String DB_NAME = "ASIGDB_TEST";
private static final String DB_USER= "test";
private static final String DB_PASSWORD= "test";
public CustomPostgresContainer() {
super(IMAGE_VERSION);
}
public static CustomPostgresContainer getCustomPostgresContainerInstance() {
if(customPostgresContainer == null) {
return extracted().withExposedPorts(EXPOSED_PORT)
.withDatabaseName(DB_NAME)
.withUsername(DB_USER)
.withPassword(DB_PASSWORD);
}
return customPostgresContainer;
}
private static CustomPostgresContainer extracted() {
return new CustomPostgresContainer();
}
@Override
public void start() {
super.start();
}
@Override
public void stop() {
//do nothing, JVM handles shut down
}
}
我得到:
到localhost:5555的连接被拒绝。检查主机名和端口是否正确以及邮局主管正在接受TCP / IP连接。
有人知道发生了什么事吗?
答案 0 :(得分:2)
根据this link,withExposedPorts()
->此公开的端口号是从容器的角度来看的。
从主机的角度来看,Testcontainer实际上是在随机的免费端口上公开的。这是设计使然,以避免本地运行的软件或并行测试运行之间可能发生的端口冲突。
因为存在此间接层,所以有必要在运行时向Testcontainers询问实际的映射端口。可以使用getMappedPort
方法来完成,该方法将原始(容器)端口作为参数:
Integer firstMappedPort = container.getMappedPort(yourExposedPort);<br/>
尝试使用DBeaver连接到首先出现的端口。