Для моего проекта мне нужно иметь задачу, которая запускает тестовый контейнер, но когда я пытаюсь запустить свою задачу, у меня возникает следующая ошибка
Previous attempts to find a Docker environment failed. Will not retry. Please see logs and check configuration
Я думаю, что это проблема конфигурации.
Я использую kotlin gradle, мой файл сборки выглядит так:
import org.testcontainers.containers.PostgreSQLContainer
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
testImplementation("org.testcontainers:postgresql")
}
buildscript {
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
"classpath"("org.testcontainers:postgresql:1.17.5")
}
}
tasks.register("postgresContainer") {
val containerInstance = PostgreSQLContainer<Nothing>("postgres:12.8")
.apply {
withDatabaseName("test")
}
containerInstance.start()
extra["containerUrl"] = containerInstance.jdbcUrl
extra["containerUsername"] = containerInstance.username
extra["containerPassword"] = containerInstance.password
extra["containerDatabaseName"] = containerInstance.databaseName
extra["containerInstance"] = containerInstance
}
Я пропустил большую часть этого, но не могу найти то, что мне не хватает
Я пытался обратиться к документации тестовых контейнеров, но не могу найти свой конкретный случай, докер вроде правильно настроен, думаю ошибка исходит от моего build.kts
Я бы предложил следующее.
Добавьте это в свой файл build.gradle.kts
, чтобы добавить поддержку тестовых контейнеров (этот конкретный пример для PostgreSQL, но идея та же...):
dependencies {
testImplementation("org.testcontainers:junit-jupiter")
testImplementation("org.testcontainers:postgresql:$testContainerVersion")
}
dependencyManagement {
imports {
mavenBom("org.testcontainers:testcontainers-bom:$testContainerVersion")
}
}
Добавьте следующее в свой класс тестов в качестве глобальной переменной:
val postgreSQLContainer = PostgreSQLContainer<Nothing>("postgres:14")
.apply {
withReuse(true)
start()
}
Лично я добавил это в класс AbstractIntegrationTest
, а также настроил контейнер следующим образом:
abstract class AbstractIntegrationTest {
companion object {
@JvmStatic
@DynamicPropertySource
fun properties(registry: DynamicPropertyRegistry) {
registry.add("spring.datasource.url", postgreSQLContainer::getJdbcUrl)
registry.add("spring.datasource.username", postgreSQLContainer::getUsername)
registry.add("spring.datasource.password", postgreSQLContainer::getPassword)
}
}
}
Обратите внимание, что withReuse(true)
— это всего лишь оптимизация, которая гарантирует, что БД не будет создаваться заново для каждого теста, поскольку это тяжелая операция, и поэтому вам нужно программно обрезать ваши таблицы между тестами...
Например:
@BeforeEach
fun setUp() {
// Test util class that truncate all tables
repoUtils.cleanTables()
}
Почему вам нужно запускать контейнеры как задачу Gradle, а не как часть тестов?