转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]
如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~
目录
背景说明
原始情况下,每次都需要 “进入docker => 进入目录 => 激活conda” 这几个步骤,非常繁琐。如何通过执行shell脚本,一键完成上述步骤?
脚本配置
脚本内容,enter_docker.sh:
#!/bin/bash
# 定义容器名称(视情况修改)
CONTAINER_NAME="cu12_docker"
# 定义目录路径(视情况修改)
DIRECTORY_PATH="/mnt/disk/proj"
# 定义conda初始化脚本路径(视情况修改)
CONDA_INIT="/root/miniconda3/etc/profile.d/conda.sh"
# 定义conda环境名称(视情况修改)
CONDA_ENV_NAME="py39"
# 进入docker容器并执行命令(通常无需修改)
docker exec -it $CONTAINER_NAME /bin/bash -c "
source $CONDA_INIT &&
cd $DIRECTORY_PATH &&
conda activate $CONDA_ENV_NAME &&
export PS1='(${CONDA_ENV_NAME}) \u@\h:\w\$ ' &&
exec /bin/bash --norc
"
给可执行权限:
chmod +x enter_docker.sh
以后每次只需要以下命令,即可完成上述步骤:
./enter_docer.sh
详细解释
指令介绍
docker exec -it $CONTAINER_NAME /bin/bash -c "..."
- 作用:在 Docker 容器
$CONTAINER_NAME
中启动一个交互式bash
终端。 -i
:保持标准输入打开,支持交互。-t
:分配一个伪终端,确保终端可用。/bin/bash -c
:运行指定的命令字符串。
source $CONDA_INIT
- 作用:加载 Conda 初始化脚本,使
conda
命令可用。 - 背景:Conda 的激活依赖于
conda.sh
,这通常位于 Conda 安装目录下的etc/profile.d/conda.sh
中。
cd $DIRECTORY_PATH
- 作用:切换到指定的工作目录
$DIRECTORY_PATH
。 - 背景:这是用户自定义的目录,用于运行代码或执行其他任务。
conda activate $CONDA_ENV_NAME
- 作用:激活指定的 Conda 虚拟环境
$CONDA_ENV_NAME
。 - 背景:在 Conda 中,激活一个虚拟环境会调整
PATH
环境变量,使 Python 和其他工具使用该环境下的版本。 - 注意:
conda activate
需要一个已初始化的 shell 环境(即必须先执行source
加载 Conda 配置)。
export PS1='(${CONDA_ENV_NAME}) \u@\h:\w\$ '
- 作用:手动设置 shell 的提示符格式,显示当前激活的 Conda 环境名。
- 解释:
(${CONDA_ENV_NAME})
:显示当前环境名(如dglv2
)。\u
:当前用户。\h
:主机名。\w
:当前工作目录。
- 背景:当 Conda 环境被激活时,通常会自动更新提示符,但在某些情况下(如 Docker 中的非交互式 shell),需要手动设置。
exec /bin/bash --norc
- 作用:启动一个新的
bash
shell,并用它替换当前 shell。 exec
:用新的bash
进程替换当前 shell,而不是开启子 shell。这避免了环境变量和其他设置被覆盖的问题。--norc
:告诉新的bash
不加载.bashrc
或其他初始化文件,防止 Conda 初始化脚本再次被加载,从而覆盖现有的激活状态。
执行流程总结
- 加载 Conda 初始化脚本,确保
conda
命令可用。 - 切换到指定目录,为后续操作做好准备。
- 激活指定虚拟环境,使当前 shell 使用目标环境的工具链。
- 设置提示符,清晰标识当前环境。
- 启动一个新的 bash 进程,以保持环境激活状态,同时避免重复加载初始化文件。
为什么这样设计
- 避免环境丢失:通过
exec /bin/bash
替换当前 shell,确保激活状态继承,而不是创建新的子 shell 导致设置丢失。 - 防止配置冲突:使用
--norc
避免重复加载.bashrc
。 - 保持交互性:提示符会反映当前的 Conda 环境,方便操作。
验证方法
- 运行命令后,查看提示符是否正确显示
(dglv2)
。 - 运行以下命令检查是否在目标环境中:
确认conda info
active environment
是否为dglv2
。