一:dockerfile文件内容,这里我们以pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel基础镜像为例:
# 定义基础镜像
FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
# 设置非互动模式以避免一些安装过程中的对话框
ENV DEBIAN_FRONTEND=noninteractive
# 删除无效的 Nvidia 存储库(如果它存在的话)
#RUN rm /etc/apt/sources.list.d/cuda.list || true
#RUN rm /etc/apt/sources.list.d/nvidia-ml.list || true
# 更新包列表并安装基本工具
RUN apt-get update && apt-get install -y \
sudo \
git \
wget \
curl \
vim \
unzip \
zip \
tar \
gzip \
openssh-server \
openssh-client \
nodejs \
npm && \
rm -rf /var/lib/apt/lists/*
# 修改 pip 源为阿里云镜像源
RUN mkdir -p /root/.pip \
&& echo "[global]" > /root/.pip/pip.conf \
&& echo "index-url = https://mirrors.aliyun.com/pypi/simple/" >> /root/.pip/pip.conf \
&& echo "trusted-host = mirrors.aliyun.com" >> /root/.pip/pip.conf
# 安装指定的 Python 库
RUN pip install \
ipykernel==6.29.5 \
jupyter_client==7.4.8 \
jupyter_core==5.7.2 \
jupyter_server==2.14.1 \
jupyterlab==4.2.3 \
nbclient==0.10.0 \
nbconvert==7.16.4 \
nbformat==5.10.4 \
notebook==6.5.7 \
traitlets==5.7.1 \
jupyter-tensorboard==0.2.0 \
jupyterlab-tensorboard-pro==4.0.0 \
tensorboard-data-server==0.7.2 \
tensorboard
# 设置 PyTorch NVML 基于 CUDA 检查环境变量
ENV PYTORCH_NVML_BASED_CUDA_CHECK=1
# 暴露 SSH 和 Jupyter Lab 端口
EXPOSE 22
EXPOSE 8888
# 将启动脚本配置在容器中
COPY setup.sh /setup.sh
RUN chmod +x /setup.sh
# 使用启动脚本作为容器初始化入口
ENTRYPOINT ["/setup.sh"]
# 在容器中创建并修改 Jupyter Lab 的配置文件
RUN echo "c.ServerApp.terminado_settings = {'shell_command': ['/bin/bash']}" > /root/.jupyter/jupyter_lab_config.py
二:启动脚本setup.sh配置内容
#!/bin/bash
# 设置清华源,如果尚未设置
if ! pip config get global.index-url | grep -q "https://pypi.tuna.tsinghua.edu.cn/simple"; then
echo "设置 pip 使用清华源..."
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
fi
# 检查 JupyterLab 是否已安装
if ! pip show jupyterlab > /dev/null 2>&1; then
echo "安装 JupyterLab..."
pip install jupyterlab==4.2.3
else
echo "JupyterLab 已安装,跳过安装步骤。"
fi
# 为 SSHD 创建必要的目录
echo "创建 SSHD 必要的目录..."
mkdir -p /var/run/sshd
mkdir -p /root/.ssh
# 为 Jupyter Lab 创建工作目录
if [ ! -d /root/workspace ]; then
echo "创建 Jupyter Lab 工作目录..."
mkdir -p /root/workspace
chown -R root:root /root/workspace
fi
# 如果 authorized_keys 文件不存在,则创建它
if [ ! -f /root/.ssh/authorized_keys ]; then
echo "创建 authorized_keys 文件..."
touch /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys
chown -R root:root /root/.ssh
fi
# 配置 sshd 服务,如果尚未配置
if [ ! -f /etc/ssh/sshd_config ]; then
echo "配置 SSHD 服务..."
cat <<EOF > /etc/ssh/sshd_config
Port 22
PermitRootLogin yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF
# 生成 sshd 主机密钥
echo "生成 SSHD 主机密钥..."
ssh-keygen -A
else
echo "SSHD 服务已经配置,跳过配置步骤。"
fi
# 检查 SSHD 服务是否正在运行,如果不是则启动
if ! pgrep -x "sshd" > /dev/null; then
echo "启动 SSHD 服务..."
/usr/sbin/sshd
else
echo "SSHD 服务已经运行,跳过启动步骤。"
fi
# 检查 JupyterLab 服务是否已经启动
if ! pgrep -f "jupyter-lab" > /dev/null; then
echo "启动 JupyterLab..."
nohup jupyter lab --ip=0.0.0.0 --allow-root --no-browser --notebook-dir=/root/workspace >/dev/null 2>&1 &
## jupyerlab加载tensorboard到看板
jupyter serverextension enable --py jupyter_tensorboard
else
echo "JupyterLab 已在运行,跳过启动步骤。"
fi
# 添加一个阻塞进程,保持容器运行
echo "容器已启动并运行,阻止脚本退出以保持容器运行..."
tail -f /dev/null