Skip to content

FlyWay tears down db #28076

@yerzhant

Description

@yerzhant

With this setup:

spring:
  r2dbc:
    url: r2dbc:tc:postgresql:///test?TC_IMAGE_TAG=12-alpine
  flyway:
    url: jdbc:tc:postgresql:12-alpine:///test

a first container (created for migrations) gets down right after successful migration and a new one gets up for testing. One can see this from this log (when one constantly runs docker ps):

    ~                                                                                                                                                                                                                        17:50:33 
❯ docker ps
CONTAINER ID   IMAGE                       COMMAND   CREATED        STATUS                  PORTS                     NAMES
953fc83fc678   testcontainers/ryuk:0.3.1   "/app"    1 second ago   Up Less than a second   0.0.0.0:61792->8080/tcp   testcontainers-ryuk-93520c73-9205-4b22-8ff2-83a1edbf980a

    ~                                                                                                                                                                                                                        17:50:37 
❯ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS                  PORTS                     NAMES
818232ec554d   postgres:12-alpine          "docker-entrypoint.s…"   1 second ago    Up Less than a second   0.0.0.0:61802->5432/tcp   intelligent_mirzakhani
953fc83fc678   testcontainers/ryuk:0.3.1   "/app"                   2 seconds ago   Up 1 second             0.0.0.0:61792->8080/tcp   testcontainers-ryuk-93520c73-9205-4b22-8ff2-83a1edbf980a

    ~                                                                                                                                                                                                                        17:50:38 
❯ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED                  STATUS                  PORTS                     NAMES
1fff5f400c40   postgres:12-alpine          "docker-entrypoint.s…"   Less than a second ago   Up Less than a second   0.0.0.0:61812->5432/tcp   festive_mcclintock
953fc83fc678   testcontainers/ryuk:0.3.1   "/app"                   3 seconds ago            Up 2 seconds            0.0.0.0:61792->8080/tcp   testcontainers-ryuk-93520c73-9205-4b22-8ff2-83a1edbf980a

    ~                                                                                                                                                                                                                        17:50:39 
❯ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                     NAMES
1fff5f400c40   postgres:12-alpine          "docker-entrypoint.s…"   5 seconds ago   Up 5 seconds   0.0.0.0:61812->5432/tcp   festive_mcclintock
953fc83fc678   testcontainers/ryuk:0.3.1   "/app"                   8 seconds ago   Up 7 seconds   0.0.0.0:61792->8080/tcp   testcontainers-ryuk-93520c73-9205-4b22-8ff2-83a1edbf980a

i.e. 818232ec554d -> 1fff5f400c40.

The same thing happens with in-mem H2 db. But after adding DB_CLOSE_DELAY=-1 parameter the issue gets resolved:

spring:
  r2dbc:
    url: r2dbc:h2:mem:///test;MODE=PostgreSQL
  flyway:
    url: jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=PostgreSQL

Sorry if this should had been ticketed in flyway's repo.

build.gradle.kts:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

buildscript {
    dependencies {
        classpath("com.google.cloud.tools:jib-spring-boot-extension-gradle:0.1.0")
    }
}

plugins {
    id("org.springframework.boot") version "2.5.4"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
    id("com.google.cloud.tools.jib") version "3.1.2"
    id("org.flywaydb.flyway") version "7.5.4"
    kotlin("jvm") version "1.5.21"
    kotlin("plugin.spring") version "1.5.21"
}

group = "kz.qbi"
version = System.getenv("CELLS_VERSION")
java.sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

extra["testcontainersVersion"] = "1.16.0"

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-webflux")
    implementation("org.springframework.boot:spring-boot-starter-data-r2dbc")
    implementation("org.springframework.boot:spring-boot-starter-validation")
    implementation("org.springframework:spring-jdbc")

    implementation("io.projectreactor.kotlin:reactor-kotlin-extensions")

    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor")

    implementation("org.flywaydb:flyway-core")

    runtimeOnly("org.postgresql:postgresql")
    runtimeOnly("io.r2dbc:r2dbc-postgresql")

    developmentOnly("org.springframework.boot:spring-boot-devtools")

    testImplementation("org.springframework.boot:spring-boot-starter-test") {
        exclude(module = "mockito-core")
    }

    testImplementation("io.projectreactor:reactor-test")

    testImplementation("org.testcontainers:junit-jupiter")
    testImplementation("org.testcontainers:postgresql")
    testImplementation("org.testcontainers:r2dbc")

    testImplementation("com.ninja-squad:springmockk:3.0.1")

    testRuntimeOnly("com.h2database:h2")
    testRuntimeOnly("io.r2dbc:r2dbc-h2")
}

dependencyManagement {
    imports {
        mavenBom("org.testcontainers:testcontainers-bom:${property("testcontainersVersion")}")
    }
}

jib {
    from {
        image = "***"
    }
    to {
        image = "***/cells"
        tags = setOf("$version")
    }
    container {
        creationTime = "USE_CURRENT_TIMESTAMP"
        user = "***"
    }
    pluginExtensions {
        pluginExtension {
            implementation = "com.google.cloud.tools.jib.gradle.extension.springboot.JibSpringBootExtension"
        }
    }
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        @Suppress("SpellCheckingInspection")
        freeCompilerArgs = listOf("-Xjsr305=strict")
        jvmTarget = "11"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
    failFast = true
}

tasks {
    build {
        dependsOn(jib)
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    for: external-projectFor an external project and not something we can fixstatus: declinedA suggestion or change that we don't feel we should currently apply

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions