开发机启动命令
为开发机指定「启动命令」字段,让开发机在启动时自动执行特定命令,实现自定义初始化、环境验证或自动化任务。
超时限制
为了确保容器实例的快速就绪和平台稳定性,我们为自定义启动命令设置了 3 分钟的超时限制。
- 开发机启动命令最多可执行 3 分钟。超过该时长,系统将强制终止该命令进程。
- 开发机启动命令的目标是执行启动自动化或快速初始化任务,不宜执行长时训练或下载操作。任何耗时不可预测的任务都可能失败。
- 若您希望执行的程序在后台持续运行(如 Jupyter、VS Code Server 等),请使用 nohup、tmux 或在命令末尾添加 & 来后台启动 。
注意
无论是否使用开发机自定义启动命令,平台都会忽略镜像中定义的 Entrypoint 或 Command。
使用场景说明
推荐(低风险)
- 使用
nohup或tmux启动已安装的服务 。 - 执行轻量级的、秒级可完成的初始化脚本(如创建目录、设置环境变量)。
- 运行快速的环境检查(如
nvidia-smi)。
- 使用
不推荐(高风险)
apt install .../yum install ...pip install -r requirements.txt/conda env create ...git clone https://...(克隆大型仓库或包含 LFS 文件的仓库)python download_dataset.py(下载大型数据集)- 原因:这些操作的耗时严重依赖于网络速度和文件大小,极易超过 3 分钟限制,导致环境配置不完整或失败。
不支持
- 由于用户自定义启动命令在 Docker 服务启动之前执行,因此并不支持在启动命令执行 「Docker 容器功能」相关操作。
注意
- 请勿使用开发机自定义启动命令来安装环境。利用类似
nohup pip install &命令绕开超时限制,有可能造成僵尸进程风险,后果自负。 - 推荐使用
Dockerfile中将所有的依赖(apt、pip、conda包,以及代码等)预先构建到您的自定义镜像中。然后,仅使用自定义启动命令来启动那些已安装的服务。 - 开发机启动后,平台会尝试自动安装 docker cli 客户端、jq、bash、openssh-server、runit、sudo、shadow-utils,无需自行安装。
使用示例
启动后台常驻服务
如果需要启动 Jupyter Lab 这类需要长时间运行的服务,可以借助使用 nohup ... &、tmux 或其他进程管理工具 让启动命令本身立即退出,而让它启动的服务进入后台。
例如,使用 nohup 启动 Jupyter Lab,并在启动命令退出后让它继续运行。
/bin/bash -c "nohup jupyter lab --ip=0.0.0.0 --port=8888 &"另一个实例,在 conda 环境中启动 Jupyter:
tmux new -d 'conda activate dev_env && jupyter notebook'注意
如果遇到问题,请确保您要使用的工具或启动的服务(如 jupyter, tmux)已预先安装在镜像中。
快速验证与轻量级初始化
检查 GPU 可用性,在容器启动时运行快速的冒烟测试或执行秒级的环境设置。
/bin/bash -c "nvidia-smi && python -c 'import torch; print(torch.cuda.is_available())'"另一个实例,执行轻量级初始化脚本:
/bin/bash -c "python /workspace/init_credentials.py && echo 'Init done'"注意
如果 init_credentials.py 脚本试图访问缓慢的网络 API,或依赖了未安装的 Python 包,可能执行失败。保证您的初始化脚本极其轻量,不依赖复杂计算或网络I/O。
打印开发机内网 IP 和 Nvidia GPU 驱动
开发机 /etc/profile.d/ 目录下的脚本会在用户每次登录 Shell 时被自动执行。我们可以通过在此路径下创建脚本,设置全局环境变量或加载自定义的启动脚本(开发机的登录 Banner 就是这样实现的)。
由于这种方式未直接修改系统主配置文件,即使改配开发机清空系统盘也仍然有效。
例如,使用以下启动命令配置 Shell 在登录时自动输出内网 IP、NVIDIA 驱动版本及 GPU 型号与数量,方便直接确认计算节点的网络与硬件环境。
# --- Script 1: Create the Intranet IP Banner ---
cat << 'EOF' > /etc/profile.d/z98-intranet-ip.sh
#!/bin/bash
# Load common library for colors
[ -f /opt/devmachine/init/bin/common.sh ] && . /opt/devmachine/init/bin/common.sh
# Get IP
CURRENT_IP=$(hostname -i)
# Print IP
if type color_print &>/dev/null; then
color_print "$(printf "Intranet IP: %s" "$CURRENT_IP")"
else
printf "\033[38;5;46mIntranet IP: %s\033[0m\n" "$CURRENT_IP"
fi
EOF
chmod +x /etc/profile.d/z98-intranet-ip.sh
# --- Script 2: Create the Extended NVIDIA Info Banner ---
cat << 'EOF' > /etc/profile.d/z99-nvidia-info.sh
#!/bin/bash
# Load common library for colors
[ -f /opt/devmachine/init/bin/common.sh ] && . /opt/devmachine/init/bin/common.sh
if command -v nvidia-smi &> /dev/null; then
# 1. Get Driver Version
DRIVER=$(nvidia-smi --query-gpu=driver_version --format=csv,noheader 2>/dev/null | head -n 1)
CAPS="${NVIDIA_DRIVER_CAPABILITIES:-Unknown}"
# 2. Print Info
if type color_print &>/dev/null; then
color_print "$(printf "Detected NVIDIA Driver: %s" "$DRIVER")"
color_print "$(printf "NVIDIA Driver Capabilities: %s" "$CAPS")"
# Loop through each GPU line from nvidia-smi -L and print it indented
nvidia-smi -L | while read -r line; do
# Add a small arrow or indent for visual hierarchy
color_print "$(printf " └─ %s" "$line")"
done
else
# Fallback if color_print is missing
printf "\033[38;5;46mDetected NVIDIA Driver: %s\033[0m\n" "$DRIVER"
printf "\033[38;5;46mNVIDIA Driver Capabilities: %s\033[0m\n" "$CAPS"
nvidia-smi -L | while read -r line; do
printf "\033[38;5;46m └─ %s\033[0m\n" "$line"
done
fi
fi
EOF
chmod +x /etc/profile.d/z99-nvidia-info.sh添加以上启动命令后,每次登录 Web Terminal 或 SSH 远程登录,均输出类似如下内容:
Intranet IP: 10.208.14.233
Detected NVIDIA Driver: 535.129.03
NVIDIA Driver Capabilities: all
└─ GPU 0: NVIDIA H800 (UUID: GPU-8f4fb99c-d471-ab88-d989-3a59590b963b)注意
开发机内网 IP 可用于同可用区内开发机之间(或 AI Coder 向开发机)快速传输数据。同可用区内网传输速度较快,获取开发机临时内网 IP 后,通过 scp 等方式快速传输数据(内网 SSH 端口为 22,支持使用开发机公网 SSH 密码验证)。开发机重启后内网 IP 可能会变化,需重新获取。
查看执行日志
开发机启动命令的执行日志存储在 /var/log/user_command 目录下。
root@is-db4qbnrdrqt47e65-devmachine-0:~# ls /var/log/user_command
init_2025_11_18_12_52_08.log