docker-compose.yml 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. services:
  2. # ── Orchestration workflow engine ─────────────────────────────────────────
  3. orchestrator:
  4. build:
  5. context: ../lf_orchestration
  6. dockerfile_inline: |
  7. FROM python:3.12-slim
  8. WORKDIR /app
  9. ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1
  10. RUN apt-get update && apt-get install -y --no-install-recommends curl \
  11. && rm -rf /var/lib/apt/lists/*
  12. COPY requirements.txt .
  13. RUN pip install --no-cache-dir -r requirements.txt
  14. COPY . .
  15. EXPOSE 1717
  16. CMD ["uvicorn", "orchestrator.main:app", "--host", "0.0.0.0", "--port", "1717"]
  17. image: lf-orchestrator:${ORCHESTRATOR_VERSION:-dev}
  18. container_name: lf-orchestrator
  19. ports:
  20. - "${ORCHESTRATOR_PORT:-1717}:1717"
  21. environment:
  22. MODE: ${ORCHESTRATOR_MODE:-plug}
  23. SPECTROMETER_URL: http://spectrometer:8000
  24. RECONSTRUCTOR_URL: http://reconstructor:8000
  25. SEQ_INTERP_URL: http://seq-interp:7475
  26. depends_on:
  27. seq-interp:
  28. condition: service_healthy
  29. restart: unless-stopped
  30. healthcheck:
  31. test: ["CMD", "curl", "-f", "http://localhost:1717/health"]
  32. interval: 10s
  33. timeout: 5s
  34. retries: 5
  35. start_period: 15s
  36. # ── MRI sequence interpreter ───────────────────────────────────────────────
  37. seq-interp:
  38. build:
  39. context: ../lf_mri/MRI-testing
  40. dockerfile: seq_interp/Dockerfile
  41. image: lf-seq-interp:${SEQ_INTERP_VERSION:-dev}
  42. container_name: lf-seq-interp
  43. ports:
  44. - "${SEQ_INTERP_PORT:-7475}:7475"
  45. volumes:
  46. - seq_interp_input:/app/seq_interp/data/input
  47. - seq_interp_output:/app/seq_interp/data/output
  48. - seq_interp_logs:/app/seq_interp/log
  49. restart: unless-stopped
  50. healthcheck:
  51. test: ["CMD", "curl", "-f", "http://localhost:7475/health"]
  52. interval: 10s
  53. timeout: 5s
  54. retries: 5
  55. start_period: 15s
  56. # ── Spectroscopy signal processor ─────────────────────────────────────────
  57. spectroscopy:
  58. build:
  59. context: ../lf_mri/fast-api-spectroscopy
  60. image: lf-spectroscopy:${SPECTROSCOPY_VERSION:-dev}
  61. container_name: lf-spectroscopy
  62. ports:
  63. - "${SPECTROSCOPY_PORT:-8002}:8002"
  64. environment:
  65. SERVICE_PORT: "8002"
  66. restart: unless-stopped
  67. healthcheck:
  68. test: ["CMD", "curl", "-f", "http://localhost:8002/health"]
  69. interval: 10s
  70. timeout: 5s
  71. retries: 5
  72. start_period: 15s
  73. # ── MRI image reconstructor ────────────────────────────────────────────────
  74. reconstructor:
  75. build:
  76. context: ../fast-api-reconstruction/serv
  77. dockerfile_inline: |
  78. FROM python:3.12-slim
  79. WORKDIR /app
  80. ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 PYTHONPATH=/app MPLBACKEND=Agg
  81. RUN apt-get update && apt-get install -y --no-install-recommends curl libgomp1 \
  82. && rm -rf /var/lib/apt/lists/*
  83. COPY requirements.txt .
  84. RUN pip install --no-cache-dir -r requirements.txt
  85. COPY . .
  86. EXPOSE 8000
  87. CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000"]
  88. image: lf-reconstructor:${RECONSTRUCTOR_VERSION:-dev}
  89. container_name: lf-reconstructor
  90. ports:
  91. - "${RECONSTRUCTOR_PORT:-8081}:8000"
  92. volumes:
  93. - reconstructor_sessions:/app/sessions
  94. restart: unless-stopped
  95. healthcheck:
  96. test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
  97. interval: 10s
  98. timeout: 5s
  99. retries: 5
  100. start_period: 20s
  101. # ── Spectrometer hardware controller (DRF) ────────────────────────────────
  102. spectrometer:
  103. build:
  104. context: ../lowfield_mri_programs/spectrometer_service/mserv00
  105. dockerfile_inline: |
  106. FROM python:3.12-slim
  107. WORKDIR /app
  108. ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 \
  109. DJANGO_SETTINGS_MODULE=mserv00.settings \
  110. DJANGO_ALLOWED_HOSTS=*
  111. RUN apt-get update && apt-get install -y --no-install-recommends curl \
  112. && rm -rf /var/lib/apt/lists/*
  113. COPY requirements.txt .
  114. RUN pip install --no-cache-dir -r requirements.txt
  115. COPY . .
  116. RUN sed -i "s/ALLOWED_HOSTS = \[.*/ALLOWED_HOSTS = ['*']/" mserv00/settings.py \
  117. && python manage.py migrate --noinput
  118. EXPOSE 8000
  119. CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
  120. image: lf-spectrometer:${SPECTROMETER_VERSION:-dev}
  121. container_name: lf-spectrometer
  122. ports:
  123. - "${SPECTROMETER_PORT:-8000}:8000"
  124. volumes:
  125. - spectrometer_db:/app/db
  126. restart: unless-stopped
  127. healthcheck:
  128. test: ["CMD", "curl", "-f", "http://localhost:8000/api/"]
  129. interval: 15s
  130. timeout: 5s
  131. retries: 5
  132. start_period: 30s
  133. volumes:
  134. seq_interp_input:
  135. seq_interp_output:
  136. seq_interp_logs:
  137. reconstructor_sessions:
  138. spectrometer_db: