Хранение базы данных на диске в TestContainers и Postgresql.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Хранение базы данных на диске в TestContainers и Postgresql.

Сообщение Anonymous »

Я хотел бы запустить TestContainers с модулем Postgres, чтобы Postgres сохранял данные на диск хоста. Мне бы хотелось, чтобы я мог запускать и останавливать тестовый контейнер, и данные, хранящиеся в базе данных, сохранялись бы при перезапусках.
При настройке по умолчанию я получаю пустую базу данных postgres каждый раз, когда запускается TestContainer.
Похоже, что запуск ожидает этой строки в системе базы данных, готовой принимать соединения журналы postgres. Кажется, этот журнал появляется, но только после сбоя.
Я попробовал следующее:
val container = PostgreSQLContainer("postgres:17")
.withDatabaseName("db-name")
.withUsername("username")
.withPassword("password")
.withFileSystemBind("/tmp/db", "/var/lib/postgresql/data", BindMode.READ_WRITE)

Это работает при первом запуске: образ запускается и работает, файлы базы данных создаются в /tmp/db. Однако при дальнейших стартах происходит следующее. Запуск занимает много времени, а затем происходит сбой.
[main] INFO {} org.testcontainers.images.PullPolicy - Image pull policy will be performed by: DefaultPullPolicy()
[main] INFO {} org.testcontainers.utility.ImageNameSubstitutor - Image name substitution will be performed by: DefaultImageNameSubstitutor (composite of 'ConfigurationFileImageNameSubstitutor' and 'PrefixingImageNameSubstitutor')
[main] INFO {} org.testcontainers.DockerClientFactory - Testcontainers version: 1.20.4
[main] INFO {} org.testcontainers.dockerclient.DockerClientProviderStrategy - Loaded org.testcontainers.dockerclient.UnixSocketClientProviderStrategy from ~/.testcontainers.properties, will try it first
[main] INFO {} org.testcontainers.dockerclient.DockerClientProviderStrategy - Found Docker environment with local Unix socket (unix:///var/run/docker.sock)
[main] INFO {} org.testcontainers.DockerClientFactory - Docker host IP address is localhost
[main] INFO {} org.testcontainers.DockerClientFactory - Connected to docker:
Server Version: 27.4.0
API Version: 1.47
Operating System: Docker Desktop
Total Memory: 7937 MB
Labels:
com.docker.desktop.address=unix:///Users/jsyrjala/Library/Containers/com.docker.docker/Data/docker-cli.sock
[main] INFO {} tc.testcontainers/ryuk:0.11.0 - Creating container for image: testcontainers/ryuk:0.11.0
[main] INFO {} tc.testcontainers/ryuk:0.11.0 - Container testcontainers/ryuk:0.11.0 is starting: f8e0d523594a94297797c41dee8659f5ed132e53943adbc13c52b41e639692c1
[main] INFO {} tc.testcontainers/ryuk:0.11.0 - Container testcontainers/ryuk:0.11.0 started in PT3.304634S
[main] INFO {} org.testcontainers.utility.RyukResourceReaper - Ryuk started - will monitor and terminate Testcontainers containers on JVM exit
[main] INFO {} org.testcontainers.DockerClientFactory - Checking the system...
[main] INFO {} org.testcontainers.DockerClientFactory - ✔︎ Docker server version should be at least 1.6.0
[main] INFO {} tc.postgres:17 - Creating container for image: postgres:17
[main] INFO {} tc.postgres:17 - Container postgres:17 is starting: 1ef08c6b4e3ae037d1ab8437a5208c74db3499034b8d7b1e0a8e4d79c34a6686
[main] ERROR {} tc.postgres:17 - Could not start container
org.testcontainers.containers.ContainerLaunchException: Timed out waiting for log output matching '.*database system is ready to accept connections.*\s'
at org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy.waitUntilReady(LogMessageWaitStrategy.java:47) ~[testcontainers-1.20.4.jar:1.20.4]
at org.testcontainers.containers.wait.strategy.AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:52) ~[testcontainers-1.20.4.jar:1.20.4]
at org.testcontainers.containers.PostgreSQLContainer.waitUntilContainerStarted(PostgreSQLContainer.java:149) ~[postgresql-1.20.4.jar:?]
at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:492) ~[testcontainers-1.20.4.jar:?]
at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:346) ~[testcontainers-1.20.4.jar:?]
at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81) [duct-tape-1.0.8.jar:?]
at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:336) [testcontainers-1.20.4.jar:?]
at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322) [testcontainers-1.20.4.jar:?]
...
[main/:?]
[main] ERROR {} tc.postgres:17 - Log output from the failed container:

PostgreSQL Database directory appears to contain a database; Skipping initialization

2025-01-18 08:41:26.663 UTC [1] LOG: starting PostgreSQL 17.2 (Debian 17.2-1.pgdg120+1) on aarch64-unknown-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
2025-01-18 08:41:26.664 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2025-01-18 08:41:26.664 UTC [1] LOG: listening on IPv6 address "::", port 5432
2025-01-18 08:41:26.671 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2025-01-18 08:41:26.693 UTC [30] LOG: database system was interrupted; last known up at 2025-01-17 23:08:41 UTC
2025-01-18 08:41:26.695 UTC [30] LOG: database system was not properly shut down; automatic recovery in progress
2025-01-18 08:41:26.701 UTC [30] LOG: redo starts at 0/1982BC8
2025-01-18 08:41:26.701 UTC [30] LOG: invalid record length at 0/1982C00: expected at least 24, got 0
2025-01-18 08:41:26.701 UTC [30] LOG: redo done at 0/1982BC8 system usage: CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
2025-01-18 08:41:26.718 UTC [28] LOG: checkpoint starting: end-of-recovery immediate wait
2025-01-18 08:41:26.725 UTC [28] LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.002 s, sync=0.001 s, total=0.015 s; sync files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0 kB; lsn=0/1982C00, redo lsn=0/1982C00
2025-01-18 08:41:26.733 UTC [1] LOG: database system is ready to accept connections

Exception in thread "main" org.testcontainers.containers.ContainerLaunchException: Container startup failed for image postgres:17
at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:351)
at org.testcontainers.containers.GenericContainer.start(GenericContainer.java:322)
...
Caused by: org.rnorth.ducttape.RetryCountExceededException: Retry limit hit with exception
at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:88)
at org.testcontainers.containers.GenericContainer.doStart(GenericContainer.java:336)
... 4 more
Caused by: org.testcontainers.containers.ContainerLaunchException: Could not create/start container
at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:556)
at org.testcontainers.containers.GenericContainer.lambda$doStart$0(GenericContainer.java:346)
at org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess(Unreliables.java:81)
... 5 more
Caused by: org.testcontainers.containers.ContainerLaunchException: Timed out waiting for log output matching '.*database system is ready to accept connections.*\s'
at org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy.waitUntilReady(LogMessageWaitStrategy.java:47)
at org.testcontainers.containers.wait.strategy.AbstractWaitStrategy.waitUntilReady(AbstractWaitStrategy.java:52)
at org.testcontainers.containers.PostgreSQLContainer.waitUntilContainerStarted(PostgreSQLContainer.java:149)
at org.testcontainers.containers.GenericContainer.tryStart(GenericContainer.java:492)
... 7 more


Подробнее здесь: https://stackoverflow.com/questions/793 ... postgresql
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»