无法连接到测试容器Postgres实例

时间:2019-09-28 22:39:47

标签: java spring postgresql spring-boot testcontainers

我已经使用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连接。

有人知道发生了什么事吗?

1 个答案:

答案 0 :(得分:2)

根据this linkwithExposedPorts()->此公开的端口号是从容器的角度来看的。
从主机的角度来看,Testcontainer实际上是在随机的免费端口上公开的。这是设计使然,以避免本地运行的软件或并行测试运行之间可能发生的端口冲突。
因为存在此间接层,所以有必要在运行时向Testcontainers询问实际的映射端口。可以使用getMappedPort方法来完成,该方法将原始(容器)端口作为参数:

Integer firstMappedPort = container.getMappedPort(yourExposedPort);<br/>

尝试使用DBeaver连接到首先出现的端口。

Screenshot with ports