97 lines
3.3 KiB
Python
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") |