#!/usr/bin/python3.4 from docker import Client from docker.errors import APIError from string import Template import json import signal import os from socket import getaddrinfo import logging def get_if_available(dict, key, defValue): if key in dict: return dict[key] else: return defValue def analyse_proxy_data(data): """Extracts the data for the proxy configuration (envrionment variable 'PROXY_DATA' and converts it to a dictionary.""" proxy_data = {} for proxy_var in data.split(','): t = proxy_var.split(":", 1) proxy_data[t[0]] = t[1] return proxy_data def analyse_env_vars(inspect_data): """Extracts the environment variables from the given result of an 'inspect container' call.""" env_data = {} counter = 0 if not 'Env' in inspect_data['Config'] or inspect_data['Config']['Env'] is None: return env_data for env_var in inspect_data['Config']['Env']: t = env_var.split("=") key = t[0] value = t[1] if key == 'PROXY_DATA': if key in env_data: key = "{key}{postfix}".format(key=key, postfix=counter) counter+=1 env_data[key] = value return env_data def handle_container(docker_client, id): """This function take a container's id and collects all data required to create a proper proxy configuration. The configuration is then written to the directory of temporary nginx files""" inspect_data = docker_client.inspect_container(id) env_vars = analyse_env_vars(inspect_data) names = [] for key in env_vars: value = env_vars[key] proxy_data = analyse_proxy_data(value) names += get_if_available(proxy_data, 'server_names', '').split(';') logging.info('list of domains on: %s', str(names)) return names def get_resolving_domains_from_containers(docker_client): container_ids = docker_client.containers(quiet=True) logging.info('list of containers: %s', str(container_ids)) domains = [] for container_id in container_ids: domains.extend(handle_container(docker_client, container_id['Id'])) logging.info('list of activated domains on containers: %s', str(domains)) resolved_domains = [] for domain in domains: try: getaddrinfo(domain, None) resolved_domains.append(domain) except Exception: pass logging.info('list of resolved domains on containers: %s', str(resolved_domains)) return resolved_domains if __name__ == '__main__': client = Client(base_url='unix://var/run/docker.sock', version='1.15') resolved_domains = get_resolving_domains_from_containers(client) print(str(resolved_domains))