首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用测试容器运行容器

无法使用测试容器运行容器
EN

Stack Overflow用户
提问于 2021-12-01 15:58:06
回答 1查看 4K关注 0票数 1

我试图使用JUnit (v1.16.2)实现一个测试容器 (v4.13.2)测试,以便更好地测试DAO/JPA类。我使用的是centos/PostgreSQL96-centos7正式的对接映像,我可以使用:docker run -d --name postgres -e POSTGRESQL_USER=user -e POSTGRESQL_PASSWORD=pass -e POSTGRES_DATABASE=db -p 5432:5432 centos/postgresql-96-centos7在cmd行上运行它。在运行单元测试之前,我删除了容器,以避免对接环境中的任何冲突。然而,当我运行我的测试时,我始终会得到以下错误:

代码语言:javascript
运行
复制
java.lang.ExceptionInInitializerError
Caused by: org.testcontainers.containers.ContainerLaunchException: Container startup failed
Caused by: org.rnorth.ducttape.RetryCountExceededException: Retry limit hit with exception
Caused by: org.testcontainers.containers.ContainerLaunchException: Could not create/start container
Caused by: java.lang.IllegalStateException: Container exited with code 2

我尝试将超时值增加到5分钟,并将其简化为JUnit4测试模式(以避免运行混合测试环境),但没有效果。我只包含抽象类的代码,因为它在调用POSTGRESQL_CONTAINER.start()之前抛出异常。

代码语言:javascript
运行
复制
public abstract class AbstractRdbmsTest {
    private static final String DOCKER_IMAGE_NAME = "centos/postgresql-96-centos7";
    private static final String POSTGRESQL_USER = "user";
    private static final String POSTGRESQL_PASSWORD = "pass";
    private static final String POSTGRESQL_DATABASE = "db";

    protected static final PostgreSQLContainer POSTGRESQL_CONTAINER;

    static {
        DockerImageName imgName = DockerImageName.parse(DOCKER_IMAGE_NAME).asCompatibleSubstituteFor("postgres");

        POSTGRESQL_CONTAINER = (PostgreSQLContainer) new PostgreSQLContainer(imgName)
                .withDatabaseName(POSTGRESQL_DATABASE)
                .withUsername(POSTGRESQL_USER)
                .withPassword(POSTGRESQL_PASSWORD)
                .withExposedPorts(PostgreSQLContainer.POSTGRESQL_PORT);

        POSTGRESQL_CONTAINER.start();
    }
}

编辑:本地Docker Env: Client/Server: Docker Engine -Communityv20.10.7

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-01 19:40:00

因此,正如上文所述,问题的解决似乎有以下几点:

代码语言:javascript
运行
复制
public abstract class AbstractRdbmsTest {
    private static final String DOCKER_IMAGE_NAME = "centos/postgresql-96-centos7";
    private static final String POSTGRESQL_USER = "user";
    private static final String POSTGRESQL_PASSWORD = "pass";
    private static final String POSTGRESQL_DATABASE = "db";

    protected static final PostgreSQLContainer CONTAINER;

    static {
        DockerImageName imgName = DockerImageName.parse(DOCKER_IMAGE_NAME).asCompatibleSubstituteFor("postgres");

        CONTAINER = (PostgreSQLContainer) new PostgreSQLContainer(imgName)
                .withDatabaseName(POSTGRESQL_DATABASE)
                .withUsername(POSTGRESQL_USER)
                .withPassword(POSTGRESQL_PASSWORD)
                .withEnv("POSTGRESQL_DATABASE", POSTGRESQL_DATABASE)
                .withEnv("POSTGRESQL_USER", POSTGRESQL_USER)
                .withEnv("POSTGRESQL_PASSWORD", POSTGRESQL_PASSWORD)
                .withExposedPorts(PostgreSQLContainer.POSTGRESQL_PORT);

        CONTAINER.setWaitStrategy(Wait.defaultWaitStrategy()
                .withStartupTimeout(Duration.of(60, SECONDS)));

        CONTAINER.start();
    }
}

添加了正确的环境变量并更改了等待策略。请注意:显然,我使用的图像比我意识到的更不标准.官方容器可能不需要更改等待策略。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70187374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档