Waits for /readyz
import subprocess
import time
import requests
class DockerComposeRunner:
def __init__(self, project_folder):
self.project_folder = project_folder
def __enter__(self):
command = ['docker-compose', 'up', '-d', '--build']
self.port = self.find_free_port()
# Set the PORT environment variable for docker-compose
env = os.environ.copy()
env['PORT'] = str(self.port)
self.process = subprocess.Popen(
command,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
cwd=self.project_folder,
env=env
)
self.wait_for_readyz(self.port)
return self.port
@staticmethod
def find_free_port():
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(('', 0))
return s.getsockname()[1]
@staticmethod
def wait_for_readyz(port, timeout=60, check_every=0.2):
url = f"http://localhost:{port}/readyz"
timeout_time = time.time() + timeout
while True:
try:
response = requests.get(url, timeout=1)
if response.status_code == 200:
print('Service is ready')
break
except (requests.ConnectionError, requests.Timeout):
pass # Ignore connection errors and timeouts, retrying until timeout is reached
if time.time() > timeout_time:
raise TimeoutError(f"Timeout while waiting for /readyz on port {port}")
time.sleep(check_every)
def __exit__(self, exc_type, exc_val, exc_tb):
command = ['docker-compose', 'down']
subprocess.run(
command,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
cwd=self.project_folder
)
with DockerComposeRunner('.') as port:
print(f"API running on port {port}")
# Perform your tasks here
# ...
No comments:
Post a Comment