diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9347df8..13bc182 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
# Changelog
+## [0.2.1]
+- Misc hot fixes
+- `LocalDriver` pull image if it doesn't exist locally.
+- Fix Compute Manager healthcheck
+
## [0.2.0]
- The objective of this release is to support mounting the Flint Metastore as a POSIX-like filesystem. Consequently, reducing the number of Docker volumes required by the Control Plane.
- The Experiment Tracker has been collapsed into the Experiment Server for simplicity and improved robustness around `inotify` events.
diff --git a/README.md b/README.md
index 952ab32..0c6c39a 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@

-
+
diff --git a/VERSION b/VERSION
index 341cf11..7dff5b8 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.2.0
\ No newline at end of file
+0.2.1
\ No newline at end of file
diff --git a/src/compute-manager/Dockerfile b/src/compute-manager/Dockerfile
index 07b0481..3e0e9ea 100644
--- a/src/compute-manager/Dockerfile
+++ b/src/compute-manager/Dockerfile
@@ -12,6 +12,11 @@ RUN poetry config virtualenvs.create false && \
FROM python:3.12-slim AS runtime
+# install curl
+RUN apt-get update && \
+ apt-get install -y --no-install-recommends curl && \
+ rm -rf /var/lib/apt/lists/*
+
WORKDIR /app
# Inject dependencies
diff --git a/src/compute-manager/src/driver/local.py b/src/compute-manager/src/driver/local.py
index fbc79ac..fe3138b 100644
--- a/src/compute-manager/src/driver/local.py
+++ b/src/compute-manager/src/driver/local.py
@@ -1,7 +1,7 @@
import asyncio
import docker
from docker.models.containers import Container
-from docker.errors import NotFound, APIError
+from docker.errors import ImageNotFound, APIError
from docker.types import LogConfig
from typing import Dict
import os
@@ -25,9 +25,31 @@ def __init__(self, config: dict):
super().__init__(config)
self._docker: docker.DockerClient = docker.from_env()
+ self._ensure_worker_image()
+
self._containers: Dict[str, Tuple[ContainerContext, Optional[Container]]] = {}
self._watch_tasks: Dict[str, asyncio.Task] = {}
+ def _ensure_worker_image(self) -> None:
+ """
+ Check for self.worker_image in the local cache, and pull from Docker Hub
+ if it's not found.
+ """
+ try:
+ self._docker.images.get(self.worker_image)
+ logging.info(f"Image {self.worker_image} already present, skipping pull.")
+ except ImageNotFound:
+ logging.info(f"Image {self.worker_image} not found locally, pulling…")
+ try:
+ self._docker.images.pull(self.worker_image)
+ logging.info(f"Successfully pulled {self.worker_image}.")
+ except APIError as e:
+ logging.error(f"Failed to pull {self.worker_image}: {e}")
+ raise e
+ except APIError as e:
+ logging.error(f"Docker error inspecting image {self.worker_image}: {e}")
+ raise e
+
async def launch_container(self, ctx: ContainerContext) -> None:
"""Start a container and begin watching it for unexpected exits."""
try:
diff --git a/src/docker-compose.build.yml b/src/docker-compose.build.yml
index 5c9ce5b..2d5d944 100644
--- a/src/docker-compose.build.yml
+++ b/src/docker-compose.build.yml
@@ -61,7 +61,12 @@ services:
context: .
dockerfile: ./workspace/Dockerfile
depends_on:
- - catalog-explorer
+ storage:
+ condition: service_healthy
+ compute-manager:
+ condition: service_healthy
+ catalog-explorer:
+ condition: service_started
restart: always
reverse-proxy:
diff --git a/src/docker-compose.release-template.yml b/src/docker-compose.release-template.yml
index 8d7c623..ee3ea73 100644
--- a/src/docker-compose.release-template.yml
+++ b/src/docker-compose.release-template.yml
@@ -55,7 +55,12 @@ services:
<<: [*storage-creds, *s3fs]
image: flintml/workspace:${VERSION}
depends_on:
- - catalog-explorer
+ storage:
+ condition: service_healthy
+ compute-manager:
+ condition: service_healthy
+ catalog-explorer:
+ condition: service_started
restart: always
reverse-proxy:
diff --git a/src/experiment-server/entrypoint.sh b/src/experiment-server/entrypoint.sh
index c811697..d11f0fd 100644
--- a/src/experiment-server/entrypoint.sh
+++ b/src/experiment-server/entrypoint.sh
@@ -39,5 +39,4 @@ server_pid=$!
aim up \
--repo /mnt/metastore/experiment \
--host 0.0.0.0 --port 43800 \
- --base-path /experiment-tracker \
- --log-level debug
\ No newline at end of file
+ --base-path /experiment-tracker
\ No newline at end of file