Image installs @deepseek-ai/dsh from npm on start. Fork 0.1.2-alpha.2 source is obsolete for this deployment path.
41 lines
1.3 KiB
Bash
Executable File
41 lines
1.3 KiB
Bash
Executable File
#!/bin/sh
|
||
# Rust 按需安装包装器:镜像里 /usr/local/bin/{cargo,rustc,rustup} 都是指向本脚本的软链接。
|
||
# 首次调用任一命令时,用 rustup-init 把最小 stable toolchain 装进 dsh-data 持久卷
|
||
# (RUSTUP_HOME/CARGO_HOME 已在镜像 ENV 中指向 /home/dsh/.dsh/...),之后直接转发到真实二进制。
|
||
# toolchain 通过 RUSTUP_DIST_SERVER(USTC 镜像)下载,重启容器后已装的 toolchain 仍保留。
|
||
set -eu
|
||
|
||
: "${RUSTUP_HOME:=/home/dsh/.dsh/rustup}"
|
||
: "${CARGO_HOME:=/home/dsh/.dsh/cargo}"
|
||
export RUSTUP_HOME CARGO_HOME
|
||
|
||
cmd="$(basename "$0")"
|
||
target="${CARGO_HOME}/bin/${cmd}"
|
||
|
||
if [ ! -x "$target" ]; then
|
||
lockdir="${RUSTUP_HOME}/.installing"
|
||
mine=0
|
||
# 并发首次调用只允许一个进程执行 rustup-init,其余进程等待它完成。
|
||
while [ "$mine" -eq 0 ]; do
|
||
if mkdir "$lockdir" 2>/dev/null; then
|
||
mine=1
|
||
elif [ -x "$target" ]; then
|
||
break
|
||
else
|
||
sleep 2
|
||
fi
|
||
done
|
||
if [ ! -x "$target" ]; then
|
||
rustup-init -y --profile minimal --default-toolchain stable --no-modify-path >&2
|
||
fi
|
||
if [ "$mine" -eq 1 ]; then
|
||
rmdir "$lockdir" 2>/dev/null || true
|
||
fi
|
||
if [ ! -x "$target" ]; then
|
||
echo "ensure-rust: rustup-init failed to install ${cmd}; check network and retry." >&2
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
exec "$target" "$@"
|