[{"content":"安装 创建Conda虚拟环境，并且安装Pytorch，Genesisi官方要求使用Python3.9+\n1 conda create -n l_gs python=3.10 -y 激活环境，从Pytorch官网获取下载指令，这里使用之前用过的cuda11.8版本\n1 cnoda activate l_gs 1 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 然后使用pip安装Genesis\n1 pip install genesis-world 安装可选功能 考虑后面的仿真任务，安装提供的运动规划功能。官方提供了简易的OMPL的API\n下载whl文件，使用pip指令安装\n1 pip install ompl-1.7.0-cp310-cp310-manylinux_2_28_x86_64.whl 因为conda环境使用python3.10，linux的x86架构，下载对应版本文件\n至此，Genesis的安装完成\n注意 发现Genesis不能像Pybullet一样保存场景，这对于需要手动提前设置场景的自动化实验很不友好😢，而且暂时没有发现鼠标交互功能，即用鼠标拖拽机器人，这种示教功能。\n","permalink":"https://cqc272hiter.top/posts/learn-genesis/","summary":"\u003ch2 id=\"安装\"\u003e安装\u003c/h2\u003e\n\u003cp\u003e创建Conda虚拟环境，并且安装Pytorch，Genesisi官方要求使用Python3.9+\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-0-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-0-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda create -n l_gs \u003cspan class=\"nv\"\u003epython\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e3.10 -y\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e激活环境，从Pytorch官网获取下载指令，这里使用之前用过的cuda11.8版本\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-1-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecnoda activate l_gs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-2-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-2-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e然后使用pip安装Genesis\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-3-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-3-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install genesis-world\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"安装可选功能\"\u003e安装可选功能\u003c/h2\u003e\n\u003cp\u003e考虑后面的仿真任务，安装提供的运动规划功能。官方提供了简易的OMPL的API\u003c/p\u003e\n\u003cp\u003e下载whl文件，使用pip指令安装\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-4-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install ompl-1.7.0-cp310-cp310-manylinux_2_28_x86_64.whl \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cp\u003e因为conda环境使用python3.10，linux的x86架构，下载对应版本文件\u003c/p\u003e\n\u003cp\u003e至此，Genesis的安装完成\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"注意\"\u003e注意\u003c/h2\u003e\n\u003cp\u003e发现Genesis不能像Pybullet一样保存场景，这对于需要手动提前设置场景的自动化实验很不友好😢，而且暂时没有发现鼠标交互功能，即用鼠标拖拽机器人，这种示教功能。\u003c/p\u003e","title":"Learn Genesis"},{"content":" 内容介绍 尝试将Conda环境下的实验，打包为Docker镜像。\n实验内容包含，Pybullet搭建仿真环境，PyTorch框架的神经网络，用于对目标点云的获取。\n实验中需要用到GPU加速。\n学习了Doker的一些基本指令，和Dockerfile内容的编写。\n导出当前的conda环境依赖 1 2 conda activate env-name conda env export --no-builds \u0026gt; environment.yml 准备项目目录如下 1 2 3 4 5 6 7 8 9 your_project/ ├── model/ ├── param/ ├── point_cloud/ ← 点云保存目录（需挂载） ├── scripts/ │ └── pipe_sim.py ← 主程序入口 ├── utils/ ├── Dockerfile └── pipe_sim_env.yml ← Conda 环境配置 编写Dockerfile文件的内容 该 Dockerfile 构建了一个用于运行 PyTorch 项目的镜像，包含 GPU 支持、系统依赖、非 root 用户环境、Conda 虚拟环境等。\n基础镜像 1 FROM pytorch/pytorch:2.5.1-cuda11.8-cudnn9-runtime 使用官方 PyTorch 镜像（已包含 Python、PyTorch、CUDA、cuDNN）。 版本为 PyTorch 2.5.1，CUDA 11.8。 版本为环境定制，从 pipe_sim_env.yml 得到。 最后上 Docker Hub 搜索可用版本。 设置为非交互模式安装软件 1 ENV DEBIAN_FRONTEND=noninteractive 避免安装时弹出交互界面，适合自动构建。 使用默认值进行交互。 安装系统依赖 1 2 3 4 5 6 7 RUN apt-get update \u0026amp;\u0026amp; apt-get install -y --no-install-recommends \\ libgl1-mesa-glx \\ libxext6 \\ libsm6 \\ libxrender1 \\ libglib2.0-0 \\ \u0026amp;\u0026amp; apt-get clean \u0026amp;\u0026amp; rm -rf /var/lib/apt/lists/* 安装图形显示相关依赖，常用于 OpenCV、matplotlib。 清除缓存以减小镜像体积。 创建非 root 用户 1 RUN useradd -m -u 1000 appuser 创建用户名为 appuser 的普通用户，避免容器中直接以 root 身份运行。 参数 含义 useradd Linux 命令，用于创建新用户。 -m 创建用户的主目录（例如 /home/appuser）。 -u 1000 指定用户的 UID（用户标识号）为 1000。 appuser 要创建的用户名。 拷贝并构建 Conda 环境 1 2 3 COPY pipe_sim_env.yml /tmp/pipe_sim_env.yml RUN conda env create -f /tmp/pipe_sim_env.yml \u0026amp;\u0026amp; \\ conda clean -ya 将本地 Conda 环境配置文件复制到容器中。 使用 Conda 创建名为 pipe_sim 的环境。 清除镜像里的 Conda 缓存。 拷贝项目代码并设置权限 1 2 3 4 5 6 7 WORKDIR /workspace COPY scripts/ ./scripts/ COPY model/ ./model/ COPY param/ ./param/ COPY utils/ ./utils/ RUN mkdir -p /workspace/point_cloud \u0026amp;\u0026amp; \\ chmod -R 777 /workspace 设置工作目录为 /workspace。 拷贝本地代码目录到镜像中。 创建点云数据输出文件夹 point_cloud。 赋予所有人可读写权限（简化调试）。 授权给普通用户 1 RUN chown -R appuser:appuser /workspace 将 /workspace 所有权转移给 appuser，避免权限问题。 切换用户 1 USER appuser 后续命令以 appuser 用户身份执行。 设置默认激活 Conda 环境 1 RUN echo \u0026#34;source activate pipe_sim\u0026#34; \u0026gt; /home/appuser/.bashrc 每次进入容器时自动激活 pipe_sim 虚拟环境。 文件结构示意 1 2 3 4 5 6 /workspace ├── scripts/ # 主程序 ├── model/ # 模型权重或定义 ├── param/ # 参数配置 ├── utils/ # 工具函数 └── point_cloud/ # 输出点云数据 Dockerfile 构建流程图 flowchart TD A[FROM 镜像] --\u003e B[安装系统依赖] B --\u003e C[创建普通用户] C --\u003e D[构建 Conda 环境] D --\u003e E[拷贝项目文件] E --\u003e F[设置权限] F --\u003e G[切换用户] G --\u003e H[设置默认环境激活] ","permalink":"https://cqc272hiter.top/posts/conda%E7%8E%AF%E5%A2%83%E7%A8%8B%E5%BA%8F%E6%89%93%E5%8C%85%E5%88%B0docker/","summary":"\u003chr\u003e\n\u003ch2 id=\"内容介绍\"\u003e内容介绍\u003c/h2\u003e\n\u003cp\u003e尝试将Conda环境下的实验，打包为Docker镜像。\u003c/p\u003e\n\u003cp\u003e实验内容包含，Pybullet搭建仿真环境，PyTorch框架的神经网络，用于对目标点云的获取。\u003c/p\u003e\n\u003cp\u003e实验中需要用到GPU加速。\u003c/p\u003e\n\u003cp\u003e学习了Doker的一些基本指令，和Dockerfile内容的编写。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"导出当前的conda环境依赖\"\u003e导出当前的conda环境依赖\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-0-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-0-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-0-2\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-0-2\"\u003e2\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda activate env-name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda env \u003cspan class=\"nb\"\u003eexport\u003c/span\u003e --no-builds \u0026gt; environment.yml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"准备项目目录如下\"\u003e准备项目目录如下\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-1-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-2\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-2\"\u003e2\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-3\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-3\"\u003e3\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-4\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-4\"\u003e4\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-5\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-5\"\u003e5\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-6\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-6\"\u003e6\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-7\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-7\"\u003e7\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-8\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-8\"\u003e8\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-1-9\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-1-9\"\u003e9\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyour_project/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── model/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── param/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── point_cloud/           ← 点云保存目录（需挂载）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── scripts/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── pipe_sim.py        ← 主程序入口\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── utils/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── Dockerfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── pipe_sim_env.yml       ← Conda 环境配置\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"编写dockerfile文件的内容\"\u003e编写Dockerfile文件的内容\u003c/h2\u003e\n\u003cp\u003e该 Dockerfile 构建了一个用于运行 PyTorch 项目的镜像，包含 GPU 支持、系统依赖、非 root 用户环境、Conda 虚拟环境等。\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"基础镜像\"\u003e基础镜像\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-2-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-2-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"s\"\u003e pytorch/pytorch:2.5.1-cuda11.8-cudnn9-runtime\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e使用官方 PyTorch 镜像（已包含 Python、PyTorch、CUDA、cuDNN）。\u003c/li\u003e\n\u003cli\u003e版本为 PyTorch 2.5.1，CUDA 11.8。\u003c/li\u003e\n\u003cli\u003e版本为环境定制，从 pipe_sim_env.yml 得到。\u003c/li\u003e\n\u003cli\u003e最后上 Docker Hub 搜索可用版本。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"设置为非交互模式安装软件\"\u003e设置为非交互模式安装软件\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-3-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-3-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eENV\u003c/span\u003e \u003cspan class=\"nv\"\u003eDEBIAN_FRONTEND\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003enoninteractive\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e避免安装时弹出交互界面，适合自动构建。\u003c/li\u003e\n\u003cli\u003e使用默认值进行交互。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"安装系统依赖\"\u003e安装系统依赖\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-4-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-4-2\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-2\"\u003e2\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-4-3\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-3\"\u003e3\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-4-4\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-4\"\u003e4\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-4-5\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-5\"\u003e5\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-4-6\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-6\"\u003e6\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-4-7\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-4-7\"\u003e7\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e apt-get update \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e apt-get install -y --no-install-recommends \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    libgl1-mesa-glx \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    libxext6 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    libsm6 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    libxrender1 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    libglib2.0-0 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e apt-get clean \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rm -rf /var/lib/apt/lists/*\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e安装图形显示相关依赖，常用于 OpenCV、matplotlib。\u003c/li\u003e\n\u003cli\u003e清除缓存以减小镜像体积。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"创建非-root-用户\"\u003e创建非 root 用户\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-5-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-5-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e useradd -m -u \u003cspan class=\"m\"\u003e1000\u003c/span\u003e appuser\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e创建用户名为 \u003ccode\u003eappuser\u003c/code\u003e 的普通用户，避免容器中直接以 root 身份运行。\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003e参数\u003c/th\u003e\n          \u003cth\u003e含义\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003euseradd\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eLinux 命令，用于创建新用户。\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e-m\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e创建用户的主目录（例如 \u003ccode\u003e/home/appuser\u003c/code\u003e）。\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003e-u 1000\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e指定用户的 UID（用户标识号）为 \u003ccode\u003e1000\u003c/code\u003e。\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eappuser\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003e要创建的用户名。\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"拷贝并构建-conda-环境\"\u003e拷贝并构建 Conda 环境\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-6-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-6-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-6-2\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-6-2\"\u003e2\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-6-3\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-6-3\"\u003e3\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e pipe_sim_env.yml /tmp/pipe_sim_env.yml\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e conda env create -f /tmp/pipe_sim_env.yml \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    conda clean -ya\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e将本地 Conda 环境配置文件复制到容器中。\u003c/li\u003e\n\u003cli\u003e使用 Conda 创建名为 \u003ccode\u003epipe_sim\u003c/code\u003e 的环境。\u003c/li\u003e\n\u003cli\u003e清除镜像里的 Conda 缓存。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"拷贝项目代码并设置权限\"\u003e拷贝项目代码并设置权限\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-7-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-7-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-7-2\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-7-2\"\u003e2\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-7-3\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-7-3\"\u003e3\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-7-4\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-7-4\"\u003e4\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-7-5\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-7-5\"\u003e5\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-7-6\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-7-6\"\u003e6\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-7-7\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-7-7\"\u003e7\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eWORKDIR\u003c/span\u003e\u003cspan class=\"s\"\u003e /workspace\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e scripts/ ./scripts/\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e model/ ./model/\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e param/ ./param/\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eCOPY\u003c/span\u003e utils/ ./utils/\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e mkdir -p /workspace/point_cloud \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"se\"\u003e\u003c/span\u003e    chmod -R \u003cspan class=\"m\"\u003e777\u003c/span\u003e /workspace\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e设置工作目录为 \u003ccode\u003e/workspace\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e拷贝本地代码目录到镜像中。\u003c/li\u003e\n\u003cli\u003e创建点云数据输出文件夹 \u003ccode\u003epoint_cloud\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e赋予所有人可读写权限（简化调试）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"授权给普通用户\"\u003e授权给普通用户\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-8-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-8-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e chown -R appuser:appuser /workspace\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e将 \u003ccode\u003e/workspace\u003c/code\u003e 所有权转移给 \u003ccode\u003eappuser\u003c/code\u003e，避免权限问题。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"切换用户\"\u003e切换用户\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-9-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-9-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eUSER\u003c/span\u003e\u003cspan class=\"s\"\u003e appuser\u003c/span\u003e\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e后续命令以 \u003ccode\u003eappuser\u003c/code\u003e 用户身份执行。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"设置默认激活-conda-环境\"\u003e设置默认激活 Conda 环境\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-10-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-10-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-dockerfile\" data-lang=\"dockerfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eRUN\u003c/span\u003e \u003cspan class=\"nb\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;source activate pipe_sim\u0026#34;\u003c/span\u003e \u0026gt; /home/appuser/.bashrc\u003cspan class=\"err\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e每次进入容器时自动激活 \u003ccode\u003epipe_sim\u003c/code\u003e 虚拟环境。\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"文件结构示意\"\u003e文件结构示意\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cdiv class=\"chroma\"\u003e\n\u003ctable class=\"lntable\"\u003e\u003ctr\u003e\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode\u003e\u003cspan class=\"lnt\" id=\"hl-11-1\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-11-1\"\u003e1\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-11-2\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-11-2\"\u003e2\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-11-3\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-11-3\"\u003e3\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-11-4\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-11-4\"\u003e4\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-11-5\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-11-5\"\u003e5\u003c/a\u003e\n\u003c/span\u003e\u003cspan class=\"lnt\" id=\"hl-11-6\"\u003e\u003ca class=\"lnlinks\" href=\"#hl-11-6\"\u003e6\u003c/a\u003e\n\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\n\u003ctd class=\"lntd\"\u003e\n\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/workspace\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── scripts/         # 主程序\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── model/           # 模型权重或定义\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── param/           # 参数配置\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── utils/           # 工具函数\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── point_cloud/     # 输出点云数据\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/table\u003e\n\u003c/div\u003e\n\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"dockerfile-构建流程图\"\u003eDockerfile 构建流程图\u003c/h2\u003e\n\u003cpre class=\"mermaid\"\u003e\n    flowchart TD\n    A[FROM 镜像] --\u003e B[安装系统依赖]\n    B --\u003e C[创建普通用户]\n    C --\u003e D[构建 Conda 环境]\n    D --\u003e E[拷贝项目文件]\n    E --\u003e F[设置权限]\n    F --\u003e G[切换用户]\n    G --\u003e H[设置默认环境激活]\n\u003c/pre\u003e\u003chr\u003e","title":"conda环境程序打包到docker"},{"content":"这是一个模板\n","permalink":"https://cqc272hiter.top/posts/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%A8%A1%E6%9D%BF/","summary":"\u003cp\u003e这是一个模板\u003c/p\u003e","title":""}]