Container images
When you launch a GPU instance or cluster, you specify a container image — a Docker image URL EcoLink pulls and runs. You can either type the image URL fresh every time, or save images to your registry for one-click reuse.
Saved images (the Registry)
The Registry (Registry → Images in the sidebar) is your per-account catalog of images you use regularly. Once saved, the image appears in the launch dialog's dropdown instead of requiring a full URL every time.
Save an image
-
Console → Registry → Images → Add image.
-
Fill in:
- Name — short friendly label
- Image URL — the full pullable reference (
nvidia/cuda:12.3.2-cudnn9-devel-ubuntu22.04,ghcr.io/me/my-image:v3, etc.) - Default command — optional override for the image's CMD
- Description — what it has / when to use it
-
Save. The image now shows up in the launch dropdown.
Using private registries
EcoLink's pullers have read access to:
- Docker Hub (public images)
- ECR public
- GHCR public
For private registries, bake credentials into a public intermediary OR push your image to a public ECR repo in our account. Ping the #ecolink-support Slack channel if you have private-registry needs — we can set up a pull secret for enterprise customers.
Image requirements
For a container to run well on EcoLink GPU instances:
- Linux x86_64 — we don't support ARM or Windows.
- Expects CUDA — the image should have CUDA libraries (from NVIDIA's base images, or installed as part of your build). The NVIDIA container runtime on our nodes exposes the GPU; the rest is up to the image.
- Runs as a long-lived process — if the image's default command exits immediately, the pod terminates. Use
CMD ["sleep", "infinity"]or a real server process to keep it alive. - Listens on expected ports — if you want a public URL (opt-in on instances and clusters, built-in for model instances), the container must bind to the service port you specify and listen on
0.0.0.0, not127.0.0.1. Without a public URL, port choice is up to you (Jupyter uses 8888 by convention).
Common images
Base CUDA
nvidia/cuda:12.3.2-cudnn9-devel-ubuntu22.04— general CUDA dev environment
Frameworks
quay.io/jupyter/pytorch-notebook:cuda12-latest— PyTorch + Jupyterquay.io/jupyter/tensorflow-notebook:cuda-latest— TensorFlow + Jupyterpytorch/pytorch:2.4.1-cuda12.1-cudnn9-runtime
Inference engines
vllm/vllm-openai:latest— vLLM OpenAI-compatible serverghcr.io/huggingface/text-generation-inference:3.0.0— HF TGIghcr.io/ggerganov/llama.cpp:full-cuda— llama.cpp with CUDA
Image/video/audio
black-forest-labs/flux-schnell:...— FLUX image generationfedirz/faster-whisper-server:0.6.0-rc.4— Whisper STTghcr.io/remsky/kokoro-fastapi-gpu:latest— Kokoro TTS
Building your own image
If none of the above fit, build your own. Minimal example:
FROM nvidia/cuda:12.3.2-cudnn9-devel-ubuntu22.04
RUN apt-get update && apt-get install -y python3 python3-pip git && rm -rf /var/lib/apt/lists/*
RUN pip install torch==2.4.1 transformers==4.45.0
WORKDIR /app
COPY server.py .
EXPOSE 8000
CMD ["python3", "-u", "server.py"]
Build, push to a public registry (Docker Hub or GHCR), then reference username/image:tag when you launch.
Tips
- Pin versions (
:v1.2.3) rather than:latest— reproducibility matters when you return to a project after a month. - Keep images slim — our pullers are fast but a 20 GB image still takes longer than a 2 GB image. Multi-stage builds help.
- Test locally with
docker run --gpus allbefore relying on it — catches missing CUDA deps early. - Use saved images for anything you use twice — saves typos and keeps your launch dialog tidy.
Related
- Launching a GPU instance
- Launching a user inference instance — for managed inference endpoints