Исправление синтаксической ошибки в molecule_executor.py и обновление k8s preset'ов
- Исправлена незакрытая скобка в _build_test_command (строка 745) - Добавлена поддержка k8s preset'ов: выполнение create_k8s_cluster.py перед create.yml - Обновлены образы в k8s preset'ах: заменен недоступный ghcr.io/ansible-community/molecule-ubuntu-systemd:jammy на inecs/ansible-lab:ubuntu22-latest - Обновлены preset'ы в базе данных через SQL - Обновлены файлы: k8s-single.yml, k8s-multi.yml, k8s-istio-full.yml
This commit is contained in:
@@ -5,6 +5,7 @@ Docker клиент для управления контейнерами
|
||||
"""
|
||||
|
||||
import docker
|
||||
from docker import APIClient
|
||||
import os
|
||||
from typing import List, Dict, Optional
|
||||
from app.core.config import settings
|
||||
@@ -25,65 +26,44 @@ class DockerClient:
|
||||
"""Ленивая инициализация Docker клиента"""
|
||||
if self._client is None:
|
||||
try:
|
||||
# Получаем DOCKER_HOST из настроек или окружения
|
||||
docker_host = os.getenv("DOCKER_HOST", settings.DOCKER_HOST)
|
||||
# Временно удаляем DOCKER_HOST из окружения, если он установлен
|
||||
# Это необходимо, так как Docker SDK может неправильно парсить его
|
||||
original_docker_host = os.environ.pop("DOCKER_HOST", None)
|
||||
|
||||
logger.info(f"Initializing Docker client with DOCKER_HOST: {docker_host}")
|
||||
|
||||
# Если DOCKER_HOST начинается с unix://, извлекаем путь к socket
|
||||
if docker_host.startswith("unix://"):
|
||||
socket_path = docker_host.replace("unix://", "")
|
||||
# Убеждаемся, что путь начинается с /
|
||||
if not socket_path.startswith("/"):
|
||||
socket_path = "/" + socket_path
|
||||
|
||||
# Docker SDK для unix socket ожидает base_url в формате "unix:///path/to/socket"
|
||||
# Важно: после unix:// должно быть три слэша (unix:///)
|
||||
# Например: "unix:///var/run/docker.sock"
|
||||
base_url = f"unix://{socket_path}"
|
||||
logger.info(f"Using unix socket: base_url={base_url}, socket_path={socket_path}")
|
||||
|
||||
# НЕ используем docker.from_env() для unix socket, так как он неправильно парсит формат
|
||||
# Используем только прямой base_url
|
||||
try:
|
||||
# Пробуем docker.from_env() без DOCKER_HOST
|
||||
logger.info("Trying docker.from_env() without DOCKER_HOST")
|
||||
self._client = docker.from_env()
|
||||
self._client.ping()
|
||||
logger.info("Docker client initialized successfully with docker.from_env()")
|
||||
except Exception as e1:
|
||||
logger.warning(f"docker.from_env() failed: {e1}")
|
||||
# Если from_env не работает, пробуем прямой base_url
|
||||
try:
|
||||
# Используем прямой путь к Docker socket
|
||||
base_url = "unix:///var/run/docker.sock"
|
||||
logger.info(f"Trying direct base_url: {base_url}")
|
||||
self._client = docker.DockerClient(base_url=base_url)
|
||||
# Проверяем подключение сразу
|
||||
self._client.ping()
|
||||
logger.info(f"Successfully created Docker client with base_url={base_url}")
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to create Docker client with base_url={base_url}: {e}")
|
||||
# Пробуем альтернативный формат (без префикса unix://)
|
||||
logger.info("Docker client initialized successfully with direct base_url")
|
||||
except Exception as e2:
|
||||
logger.error(f"Direct base_url also failed: {e2}")
|
||||
# Последняя попытка - используем APIClient
|
||||
try:
|
||||
# Некоторые версии SDK могут требовать просто путь
|
||||
# Но это не работает, так как base_url должен быть полный URL
|
||||
# Поэтому пробуем стандартный формат по умолчанию
|
||||
logger.warning("Trying default socket path")
|
||||
logger.info("Trying APIClient as last resort")
|
||||
api_client = APIClient(base_url="unix:///var/run/docker.sock")
|
||||
api_client.version()
|
||||
# Если APIClient работает, создаем DockerClient
|
||||
self._client = docker.DockerClient(base_url="unix:///var/run/docker.sock")
|
||||
self._client.ping()
|
||||
logger.info("Successfully created Docker client with default socket")
|
||||
except Exception as e2:
|
||||
logger.error(f"All methods failed. Last error: {e2}")
|
||||
logger.info("Docker client initialized successfully with APIClient")
|
||||
except Exception as e3:
|
||||
logger.error(f"All methods failed. Last error: {e3}")
|
||||
raise
|
||||
elif docker_host.startswith("/"):
|
||||
# Прямой путь к socket - используем base_url с префиксом unix://
|
||||
base_url = f"unix://{docker_host}"
|
||||
logger.info(f"Using direct socket path: {base_url}")
|
||||
self._client = docker.DockerClient(base_url=base_url)
|
||||
else:
|
||||
# Для других форматов (tcp://, http:// и т.д.) используем from_env
|
||||
# Но сначала проверяем, не установлена ли переменная DOCKER_HOST
|
||||
if "DOCKER_HOST" in os.environ:
|
||||
# Если DOCKER_HOST установлен, но не unix://, используем from_env
|
||||
logger.info("Using docker.from_env()")
|
||||
self._client = docker.from_env()
|
||||
else:
|
||||
# Если DOCKER_HOST не установлен, используем стандартный socket
|
||||
logger.info("Using default socket: unix:///var/run/docker.sock")
|
||||
self._client = docker.DockerClient(base_url="unix:///var/run/docker.sock")
|
||||
|
||||
# Проверка подключения
|
||||
self._client.ping()
|
||||
logger.info("Docker client initialized successfully")
|
||||
finally:
|
||||
# Восстанавливаем DOCKER_HOST, если он был установлен
|
||||
if original_docker_host:
|
||||
os.environ["DOCKER_HOST"] = original_docker_host
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to initialize Docker client: {e}")
|
||||
logger.error(f"DOCKER_HOST env: {os.getenv('DOCKER_HOST', 'not set')}")
|
||||
|
||||
Reference in New Issue
Block a user