【教程】一键完成进入Docker并激活Conda虚拟环境

发布于:2024-12-18 ⋅ 阅读:(12) ⋅ 点赞:(0)

转载请注明出处:小锋学长生活大爆炸[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 初始化脚本再次被加载,从而覆盖现有的激活状态。

执行流程总结

  1. 加载 Conda 初始化脚本,确保 conda 命令可用。
  2. 切换到指定目录,为后续操作做好准备。
  3. 激活指定虚拟环境,使当前 shell 使用目标环境的工具链。
  4. 设置提示符,清晰标识当前环境。
  5. 启动一个新的 bash 进程,以保持环境激活状态,同时避免重复加载初始化文件。

为什么这样设计

  • 避免环境丢失:通过 exec /bin/bash 替换当前 shell,确保激活状态继承,而不是创建新的子 shell 导致设置丢失。
  • 防止配置冲突:使用 --norc 避免重复加载 .bashrc
  • 保持交互性:提示符会反映当前的 Conda 环境,方便操作。

验证方法

  1. 运行命令后,查看提示符是否正确显示 (dglv2)
  2. 运行以下命令检查是否在目标环境中:
    conda info
    确认 active environment 是否为 dglv2