auto-configure extra_hosts for docling connectivity
Automatically maps host.docker.internal to host IP in docker-compose.yml during TUI setup. Fixes docling connection issues on systems where host.docker.internal doesn't auto-resolve.
This commit is contained in:
parent
b195576f14
commit
6b1af7e862
1 changed files with 77 additions and 0 deletions
|
|
@ -125,6 +125,12 @@ class ContainerManager:
|
|||
# Copy to TUI directory
|
||||
tui_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
content = compose_resource.read_text()
|
||||
|
||||
# Auto-configure extra_hosts for container-to-host connectivity
|
||||
# Only modify the main docker-compose.yml, not the GPU override
|
||||
if not filename.endswith("gpu.yml"):
|
||||
content = self._add_extra_hosts_to_compose(content)
|
||||
|
||||
tui_path.write_text(content)
|
||||
return tui_path
|
||||
else:
|
||||
|
|
@ -137,6 +143,77 @@ class ContainerManager:
|
|||
self._compose_search_log += f"\n 4. Falling back to: {tui_path.absolute()}"
|
||||
return tui_path
|
||||
|
||||
def _add_extra_hosts_to_compose(self, content: str) -> str:
|
||||
"""Add extra_hosts configuration to docker-compose.yml for docling connectivity.
|
||||
|
||||
This ensures containers can reach host-based docling-serve by mapping
|
||||
host.docker.internal to the detected host IP.
|
||||
|
||||
Args:
|
||||
content: Original docker-compose.yml content
|
||||
|
||||
Returns:
|
||||
Modified docker-compose.yml content with extra_hosts
|
||||
"""
|
||||
# Import yaml here to avoid hard dependency (follows pattern from _extract_images_from_compose_config)
|
||||
try:
|
||||
import yaml
|
||||
except ImportError:
|
||||
logger.debug("PyYAML not available, skipping extra_hosts configuration")
|
||||
return content
|
||||
|
||||
try:
|
||||
from utils.container_utils import guess_host_ip_for_containers
|
||||
|
||||
# Detect the host IP that containers can use
|
||||
host_ip = guess_host_ip_for_containers(logger=logger)
|
||||
|
||||
# Skip if we couldn't detect a valid host IP
|
||||
if not host_ip or host_ip == "127.0.0.1":
|
||||
logger.debug("Skipping extra_hosts configuration (no container bridge IP detected)")
|
||||
return content
|
||||
|
||||
# Parse the docker-compose.yml
|
||||
compose_data = yaml.safe_load(content)
|
||||
|
||||
if not compose_data or "services" not in compose_data:
|
||||
logger.debug("Could not parse docker-compose.yml or no services found")
|
||||
return content
|
||||
|
||||
# Add extra_hosts to services that need to connect to host (docling-serve)
|
||||
services_needing_host_access = ["openrag-backend", "langflow"]
|
||||
extra_hosts_config = [f"host.docker.internal:{host_ip}"]
|
||||
|
||||
modified = False
|
||||
for service_name in services_needing_host_access:
|
||||
if service_name in compose_data["services"]:
|
||||
# Add or update extra_hosts
|
||||
if "extra_hosts" not in compose_data["services"][service_name]:
|
||||
compose_data["services"][service_name]["extra_hosts"] = extra_hosts_config
|
||||
modified = True
|
||||
logger.info(
|
||||
f"Added extra_hosts to {service_name} service for docling connectivity: "
|
||||
f"host.docker.internal -> {host_ip}"
|
||||
)
|
||||
|
||||
if modified:
|
||||
# Convert back to YAML
|
||||
modified_content = yaml.dump(
|
||||
compose_data,
|
||||
default_flow_style=False,
|
||||
sort_keys=False,
|
||||
width=120
|
||||
)
|
||||
return modified_content
|
||||
else:
|
||||
return content
|
||||
|
||||
except Exception as e:
|
||||
# If anything fails, return original content
|
||||
# This ensures we don't break the compose file if something goes wrong
|
||||
logger.debug(f"Could not add extra_hosts to docker-compose.yml: {e}")
|
||||
return content
|
||||
|
||||
def _get_env_from_file(self) -> Dict[str, str]:
|
||||
"""Read environment variables from .env file, prioritizing file values over os.environ.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue