projetPulumi/__main__.py
2024-12-07 13:11:08 +01:00

97 lines
3.3 KiB
Python

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")