gpt4 book ai didi

docker - Gradle docker镜像无法连接到mysql testcontainer

转载 作者:行者123 更新时间:2023-12-03 05:30:17 34 4
gpt4 key购买 nike

我有一个使用MySQL Test容器的小型集成测试。

当我在本地构建时,运行简单的gradlew build命令,它将运行,测试并构建项目。但是,当我尝试使用正式的gradle docker镜像时,该测试将暂停,以等待mysql数据库的可用性。

运行我的构建时,它将创建3个容器:

  • Gradle容器
  • quay.io/testcontainers/ryuk:0.2.3
  • mysql:最新

  • 我的gradle镜像不同于官方镜像,因为它安装了docker:
    FROM gradle
    USER root
    RUN apt-get update && \
    apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
    apt-key fingerprint 0EBFCD88 && \
    add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable" && \
    apt-get update && \
    apt-get install -y docker-ce docker-ce-cli containerd.io

    当连接停止时,我连接到了gradle镜像,并安装了mysql客户端。我尝试连接到测试正在连接的同一镜像,并且连接没有问题。
    有谁知道我在做什么错,因为仅在容器内运行构建,我就有这个问题?

    我用这个运行:
    docker container run -v /var/run/docker.sock:/var/run/docker.sock -v <local repo>:/home/gradle/project -w /home/gradle/project --rm mygradle gradle build -i

    编辑:
    这不是因为gradle docker镜像,而是任何镜像。如果我使用Jenkins运行,并且它是一个容器,那么这也行不通。尝试连接到172.x.x.1(主机地址)和暴露的端口,并且测试未连接,但是访问容器,并尝试使用mysql客户端进行完全相同的连接,我可以连接。

    最佳答案

    我找到了解决方案。

    我没有使用MysqlContainer类,而是定义了一个扩展该类的新类。它将检测应用程序是否在容器内运行,如果是,它将尝试在内部连接到数据库容器,而不是使用localhost和生成的端口。

     public static class IntegrationTestsDatabase<SELF extends MySQLContainer<SELF>> extends MySQLContainer<SELF> {
    public IntegrationTestsDatabase() {
    }

    public IntegrationTestsDatabase(String dockerImageName) {
    super(dockerImageName);
    }

    public String getJdbcUrl() {
    String containerIp = ((ContainerNetwork)this.getContainerInfo().getNetworkSettings().getNetworks().values().stream().findFirst().get()).getIpAddress();
    return this.isRunningInsideDocker() ? "jdbc:mysql://" + containerIp + ":" + MySQLContainer.MYSQL_PORT + "/" + this.getDatabaseName() : super.getJdbcUrl();
    }

    public Boolean isRunningInsideDocker() {
    try {
    Stream stream = Files.lines(Paths.get("/proc/1/cgroup"));

    Boolean var2;
    try {
    var2 = stream.anyMatch((line) -> {
    return line.contains("/docker");
    });
    } catch (Throwable var5) {
    if (stream != null) {
    try {
    stream.close();
    } catch (Throwable var4) {
    var5.addSuppressed(var4);
    }
    }

    throw var5;
    }

    if (stream != null) {
    stream.close();
    }

    return var2;
    } catch (IOException var6) {
    return false;
    }
    }
    }

    这将与其他容器类型一起使用。

    关于docker - Gradle docker镜像无法连接到mysql testcontainer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59580477/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com