Реализация модуля библиотеки testcontainers для работы с docker образами БД tarantool
// Время ожидания готовности сервера БД принимать запросы
waitStartTimeout := 5*time.Second
// Создает и запускает контейнер с выбранным образом тарантула версии
container, err := RunContainer(ctx,
WithTarantool15("tarantool/tarantool:2.10", waitStartTimeout),
)
if err != nil {
return fmt.Errorf("failed to run container: %w", err)
}
...
// Получает строку соединения вида host:port для доступа в сервер БД в запущенном контейнере
dbConnectionStr, err := container.ServerHostPort()
...
// Удаляет контейнер
if err := container.Terminate(ctx); err != nil {
return fmt.Errorf("failed to terminate container: %w", err)
}
// Время ожидания готовности сервера БД принимать запросы
waitStartTimeout := 5*time.Second
// Путь к файлу конфигурации тарантула
configPath := ".../tarantool15.cfg"
// Путь к файлам с луа функциями
scriptsPath := "./"
// Реализация методов логера testcontainers.Logging
logger := MyLogger()
// Создает контейнер
container, err := NewContainer(ctx,
// с образом тарантула версии
WithTarantool15("tarantool/tarantool:1.5", waitStartTimeout),
// с файлом конфигурации тарантула монтируемым в контейне по пути /etc/tarantool/tarantool.cfg
WithConfigFile(configPath, "/etc/tarantool/tarantool.cfg"),
// с папкой скриптов содержищих луакод монтируемым в контейне по пути /opt/luascript/
WithScriptsMapping(scriptsPath, "/opt/luascript/"),
// со сбором логов из контейнера
WithLogger(logger),
)
if err != nil {
return fmt.Errorf("failed to create container: %w", err)
}
// Запускает контейнер
if err := c.StartContainer(ctx); err != nil {
return fmt.Errorf("can't start container: %w", err)
}
...
// Получает строку соединения вида host:port для доступа в сервер БД в запущенном контейнере
dbConnectionStr, err := container.ServerHostPort()
...
// Останавливает контейнер
if err := container.Stop(ctx); err != nil {
return fmt.Errorf("failed to terminate container: %w", err)
}
}
WithTarantool15(image string, waitTimeout time.Duration)
- ожидает в теченииwaitTimeout
готовность сервера БД tarantool версии 1.5 поднимаемого из образаimage
WithTarantool2(image string, waitTimeout time.Duration)
- ожидает в теченииwaitTimeout
готовность сервера БД tarantool версий 1.6-2.11 поднимаемого из образаimage
WithCommand(cmd []string)
- переопределяет поведения при запуске контейнера, выполняя команды cmdWithArguments(args ...string)
- запуск контейнера tarantool с аргументами для entrypoint, например для образа tarantool/tarantool:2.11 в качестве аргумента можно передать путь к файлу с lua скриптом, который будет выполнен после старта контейнераWithScripts(hostPath string, containerPath string)
- копирует папку с lua скриптами в контейнер перед запуском контейнера, используется, когда нет возможности монтировать из файловой системыWithConfigFileMapping(cfgPath, containerCfgPath string)
- монтирует файл расположенной в cfgPath в контейнер по пути containerCfgPathWithName(name string, reuse bool)
- задает фиксированное имя для контейнера и возможность переиспользовать уже существующий контейнер с этим именемWithEnv(prefix string)
- копирует в контейнер переменные окружения начинающиеся с prefix, например WithEnv("TARANTOOL_")WithHookOnStartTarantool(hook func(ctx context.Context, connection string) error)
- регистрирует функцию, которая будет выполнена после запуска в контейнере сервера БД. В функцию передается строка соединения видаhost:port
для доступа в сервер БДWithHookOnStopTarantool(hook func(ctx context.Context, connection string) error)
- регистрирует функцию, которая будет выполнена перед остановкой в контейнере сервера БД. В функцию передается строка соединения видаhost:port
для доступа в сервер БД
CopyDirToContainer(hostDirPath string, containerParentPath string, fileMode int64)
- обертка над оригинальным методомtestcontainers.Container
позволяет копировать файлы с хост машины, включая содержимое символических ссылок на файлы. Используется, когда нет возможности монтировать из файловой системы
Необходимо настроить переменную окружения DOCKER_HOST, см. детали конфигурирования
Необходимо для запуска контейнеров x86 архитектуры на macos M1)
Настроить переменные окружения:
- DOCKER_HOST=$(limactl list docker --format 'unix://{{.Dir}}/sock/docker.sock'), например DOCKER_HOST="unix://${HOME}/.lima/default/sock/docker.sock"
- TT_HOST=ip по которой доступна гостевая ОС на хосте (необходимо предварительно настроить сеть )
- TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=unix:///var/run/docker.sock
В случае медленных виртуальных эмуляторов сетевых интерфейсов (например qemu) контейнер может быть не доступен сразу для соединения с хостмашины. В этом случае можно установить переменную окружения TC_HOST_AVAILABLE_TIMEOUT_SECOND=значения таймаута в секундах, которая задает таймаут ожидания доступности с хостмашины соединения по tcp к портам контейнера