Add volume and network parsing functionality
- Parse Docker compose volumes (bind mounts and named volumes) - Handle external volume detection - Parse network configuration with external network support - Support both short and long syntax for volumes/networks
This commit is contained in:
@@ -44,6 +44,78 @@ class Docker2PBS:
|
|||||||
|
|
||||||
self.service_config = self.compose_data['services'][self.service_name]
|
self.service_config = self.compose_data['services'][self.service_name]
|
||||||
|
|
||||||
|
def parse_volumes(self) -> List[Dict[str, Any]]:
|
||||||
|
"""Parse volumes configuration for the service"""
|
||||||
|
volumes = []
|
||||||
|
|
||||||
|
# Get service volumes
|
||||||
|
if 'volumes' in self.service_config:
|
||||||
|
for volume in self.service_config['volumes']:
|
||||||
|
volume_info = {'type': 'bind', 'external': False}
|
||||||
|
|
||||||
|
if isinstance(volume, str):
|
||||||
|
# Short syntax: "host_path:container_path"
|
||||||
|
parts = volume.split(':')
|
||||||
|
if len(parts) >= 2:
|
||||||
|
volume_info.update({
|
||||||
|
'source': parts[0],
|
||||||
|
'target': parts[1],
|
||||||
|
'mode': parts[2] if len(parts) > 2 else 'rw'
|
||||||
|
})
|
||||||
|
elif isinstance(volume, dict):
|
||||||
|
# Long syntax
|
||||||
|
volume_info.update(volume)
|
||||||
|
if volume_info.get('type') == 'volume':
|
||||||
|
# Check if it's external volume
|
||||||
|
volume_name = volume_info.get('source')
|
||||||
|
if volume_name and self.is_external_volume(volume_name):
|
||||||
|
volume_info['external'] = True
|
||||||
|
|
||||||
|
volumes.append(volume_info)
|
||||||
|
|
||||||
|
return volumes
|
||||||
|
|
||||||
|
def is_external_volume(self, volume_name: str) -> bool:
|
||||||
|
"""Check if volume is external"""
|
||||||
|
if 'volumes' in self.compose_data:
|
||||||
|
volume_config = self.compose_data['volumes'].get(volume_name, {})
|
||||||
|
return volume_config.get('external', False)
|
||||||
|
return False
|
||||||
|
|
||||||
|
def parse_networks(self) -> List[Dict[str, Any]]:
|
||||||
|
"""Parse network configuration for the service"""
|
||||||
|
networks = []
|
||||||
|
|
||||||
|
if 'networks' in self.service_config:
|
||||||
|
service_networks = self.service_config['networks']
|
||||||
|
|
||||||
|
if isinstance(service_networks, list):
|
||||||
|
# Short syntax
|
||||||
|
for network in service_networks:
|
||||||
|
networks.append({
|
||||||
|
'name': network,
|
||||||
|
'external': self.is_external_network(network)
|
||||||
|
})
|
||||||
|
elif isinstance(service_networks, dict):
|
||||||
|
# Long syntax
|
||||||
|
for network_name, config in service_networks.items():
|
||||||
|
network_info = {
|
||||||
|
'name': network_name,
|
||||||
|
'external': self.is_external_network(network_name)
|
||||||
|
}
|
||||||
|
if config:
|
||||||
|
network_info.update(config)
|
||||||
|
networks.append(network_info)
|
||||||
|
|
||||||
|
return networks
|
||||||
|
|
||||||
|
def is_external_network(self, network_name: str) -> bool:
|
||||||
|
"""Check if network is external"""
|
||||||
|
if 'networks' in self.compose_data:
|
||||||
|
network_config = self.compose_data['networks'].get(network_name, {})
|
||||||
|
return network_config.get('external', False)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='Backup Docker service to Proxmox Backup Server')
|
parser = argparse.ArgumentParser(description='Backup Docker service to Proxmox Backup Server')
|
||||||
|
|||||||
Reference in New Issue
Block a user