# syntax=docker/dockerfile:1 # dockerfiles/Dockerfile.hermes-jetson-stt FROM dustynv/whisper@sha256:725c23a68ace3ee667b6465468c38d90e6a0cda9891923a7dd98b851d557569e USER root # The JetPack 5 base supplies the CUDA-enabled PyTorch build. Keep Whisper new # enough for the multilingual turbo model while preserving that Jetson stack. RUN python3 -m pip install --no-cache-dir --force-reinstall --no-deps \ openai-whisper==20250625 # Keep model acquisition in the audited image build. Runtime pods never need # public egress and Whisper verifies the same digest when loading this cache. ADD --checksum=sha256:aff26ae408abcba5fbf8813c21e62b0941638c5f6eebfb145be0c9839262a19a --chmod=0444 \ https://openaipublic.azureedge.net/main/whisper/models/aff26ae408abcba5fbf8813c21e62b0941638c5f6eebfb145be0c9839262a19a/large-v3-turbo.pt \ /opt/models/whisper/large-v3-turbo.pt ADD --checksum=sha256:9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794 --chmod=0444 \ https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt \ /opt/models/whisper/small.pt ADD --checksum=sha256:65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9 --chmod=0444 \ https://openaipublic.azureedge.net/main/whisper/models/65147644a518d12f04e32d6f3b26facc3f8dd46e5390956a9424a650c0ce22b9/tiny.pt \ /opt/models/whisper/tiny.pt RUN chmod 0555 /opt/models /opt/models/whisper COPY dockerfiles/hermes-jetson-stt-server.py /opt/atlas/hermes-jetson-stt-server.py RUN chmod 0555 /opt/atlas/hermes-jetson-stt-server.py # The vendor image defaults to /opt/whisper, whose 2023 source checkout would # shadow the pinned Python package. Run Atlas code from its own directory. WORKDIR /opt/atlas # Import the Xavier CUDA stack and confirm Whisper resolves the baked artifact. # Full GPU warm-up is covered by the Kubernetes startup probe on titan-21. RUN python3 -c "import stat; from pathlib import Path; import torch, whisper; p=Path('/opt/models/whisper'); print(whisper.__file__, whisper.__version__, whisper.available_models()); assert {'large-v3-turbo','small','tiny'} <= set(whisper.available_models()); assert stat.S_IMODE(p.stat().st_mode)==0o555; assert all(stat.S_IMODE((p/name).stat().st_mode)==0o444 for name in ('large-v3-turbo.pt','small.pt','tiny.pt')); print(torch.__version__)" ENV HERMES_STT_HOST=0.0.0.0 \ HERMES_STT_PORT=9000 \ HERMES_STT_MODEL=large-v3-turbo \ HERMES_STT_ROLLING_MODEL=tiny \ HERMES_STT_CACHE=/opt/models/whisper \ PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 EXPOSE 9000 ENTRYPOINT ["python3", "/opt/atlas/hermes-jetson-stt-server.py"]