services: gemma4: build: context: . dockerfile: Dockerfile image: gemma4-bi150:${TAG:-2026-10-27} container_name: gemma4 # 镜像本身不设置启动命令,启动方式全部由这里决定。 entrypoint: ["/usr/local/bin/gemma4-entrypoint.sh"] working_dir: /opt/gemma4 # 容器内固定监听 80,宿主机端口由 HOST_PORT 决定(默认 24396)。 expose: - "80" ports: - "${HOST_PORT:-24396}:80" # bridge 网络 + 端口映射;ipc host 供 vLLM/PyTorch 多卡共享内存。 ipc: host # Iluvatar 运行时需要 privileged + /dev 绑定。 # 只给 --device=/dev/iluvatar* 会在 worker init 时报 # cudaGetDeviceCount() ... Error 1001 privileged: true pid: host volumes: - /dev:/dev - ${MODEL_HOST_DIR:-/mnt/disk0/models/google/gemma-4-31B-it}:/models/gemma4:ro environment: MODEL_PATH: /models/gemma4 AUTO_DETECT: "${AUTO_DETECT:-1}" HOST: "${HOST:-0.0.0.0}" # 默认给 4 张(Gemma-4-31B 的 TP4);GEV 只需要 2 张, # entrypoint 按检测出的 TP 使用前 TP 张。 CUDA_VISIBLE_DEVICES: "${GPUS:-15,14,13,12}" # 容器内端口固定 80,模型名固定 llm(AGENTS.md 5.2 / 5.5)。 PORT: "80" SERVED_NAME: "${SERVED_NAME:-llm}" # 留空时由 entrypoint 根据 config.json 自动判断。 # 需要手动覆盖时直接设置同名环境变量即可。 TP: "${TP:-}" MAX_NUM_SEQS: "${MAX_NUM_SEQS:-}" GPU_MEM_UTIL: "${GPU_MEM_UTIL:-}" ENFORCE_EAGER: "${ENFORCE_EAGER:-}" MAX_MODEL_LEN: "${MAX_MODEL_LEN:-8192}" MAX_IMAGES: "${MAX_IMAGES:-4}" PYTHONUNBUFFERED: "1" EXTRA_ARGS: "${EXTRA_ARGS:-}" ulimits: memlock: -1 stack: 67108864 restart: unless-stopped