import pulumi import pulumi_docker as docker import json import os # Load config.json try: with open("config.json", "r") as f: containers_data = json.load(f) except FileNotFoundError: raise Exception("Error: config.json not found.") # Create the network network = docker.Network("testNetwork") # Helper function to create containers def create_container(container_data, network, i=0): container_name = f"{container_data['name']}-{i}" if container_data.get("instances", 1) > 1 else container_data["name"] volumes = {} for vol in container_data.get("volumes", []): if "volume_name" in vol and vol["volume_name"] not in volumes: volumes[vol["volume_name"]] = docker.Volume(vol["volume_name"]) volumes_config = [ docker.ContainerVolumeArgs(container_path=v["container_path"], volume_name=volumes[v["volume_name"]].name) if "volume_name" in v else docker.ContainerVolumeArgs(container_path=v["container_path"], host_path=os.path.abspath(v["host_path"])) for v in container_data.get("volumes", []) ] envs = [f"{k}={v}" for k, v in container_data.get("envs", {}).items()] # Handle custom images: image_name = container_data.get("image") #Get image name; Handle potential missing key if image_name is None: raise ValueError(f"Missing 'image' key in container data: {container_data}") image = None if image_name.endswith(".dockerfile"): image_name = image_name[:-len(".dockerfile")] image = docker.Image( f"localhost:5000/{image_name}_image:latest", # Fully qualified name with image_name build=docker.DockerBuildArgs( context="./", dockerfile=image_name + ".dockerfile" ), ) container_image = image.id else: container_image = image_name container = docker.Container( container_name, image=container_image, hostname=container_name, envs=envs, ports=[docker.ContainerPortArgs(internal=p["internal"], external=p["external"] + i) for p in container_data.get("ports", [])], volumes=volumes_config, network_mode=network.name, ) ports = container_data.get("ports", []) if ports: for port in ports: external_port = port["external"] + i pulumi.export(f"{container_name}_url", f"http://localhost:{external_port}") return container # Create containers containers = [] for container_data in containers_data.get("containers", []): instances = container_data.get("instances", 1) for i in range(instances): containers.append(create_container(container_data, network, i)) # Prometheus Exporter (Separate Container) exporter_image = docker.Image( "localhost:5000/postgres_metrics_exporter_image:latest", build=docker.DockerBuildArgs( context="./", dockerfile="postgres_metrics_exporter.Dockerfile" ), ) exporter_container = docker.Container( "postgres_metrics_exporter", image=exporter_image.id, ports=[docker.ContainerPortArgs(internal=8000, external=8000)], network_mode=network.name, env=[ "POSTGRES_HOST=admin", "POSTGRES_DB=admin", "POSTGRES_USER=admin", "POSTGRES_PASSWORD=admin", ], ) pulumi.export("exporter_url", f"http://localhost:8000")