前言
很多人迁移 conda 环境到 Docker 会直接复制miniforge3/envs/环境名文件夹,这种方式极其容易翻车:
- 环境内硬编码宿主机路径,容器内报错;
- 存在系统 ABI、平台架构绑定包(linux 本地编译包);
- 镜像体积臃肿,包含大量无用缓存、冗余依赖;
- 跨服务器、跨 CUDA 版本极易出现动态链接冲突。
最优工程方案:导出环境配置文件 → Docker 内全新重建 conda 环境
推荐迁移流程是这条:
- 在宿主机导出 conda 环境
- 准备
Dockerfile - 在镜像里根据
environment.yml重建环境 - 运行容器验证
第一步:导出环境
先激活你要迁移的环境,比如 pt2.6:
bash
conda activate pt2.6
导出成 YAML:
bash
conda env export > environment.yml
如果你想要更干净、减少平台绑定,建议用这个:
bash
conda env export --from-history > environment.yml
区别是:
conda env export
会导出完整依赖,版本很全,但可能带很多平台相关包--from-history
只导出你显式安装过的核心包,更适合迁移到 Docker
如果这个环境里还用 pip 装过东西,再执行:
bash
pip freeze > requirements.txt
yaml
absl-py==2.4.0
astunparse==1.6.3
attrs==26.1.0
certifi==2026.6.17
charset-normalizer==3.4.7
cloudpickle==3.1.2
decorator==5.3.1
dm-tree==0.1.10
filelock==3.29.0
flatbuffers==25.12.19
fsspec==2026.4.0
...
yaml
name: pt2.6
channels:
- conda-forge
dependencies:
- python=3.10
- pip
很多项目实际会同时保留:
environment.ymlrequirements.txt
第二步:写 Dockerfile
如果你就是想把 conda 环境搬进 Docker,最常见写法是:
dockerfile
FROM continuumio/miniconda3:latest
WORKDIR /workspace
COPY environment.yml /workspace/environment.yml
COPY requirements.txt /workspace/requirements.txt
RUN conda env create -f /workspace/environment.yml
SHELL ["conda", "run", "-n", "pt2.6", "/bin/bash", "-c"]
RUN pip install --no-cache-dir --upgrade pip
RUN pip install --no-cache-dir torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 \
--index-url https://download.pytorch.org/whl/cu126
RUN pip install --no-cache-dir -r /workspace/requirements.txt
COPY . /workspace
CMD ["conda", "run", "--no-capture-output", "-n", "pt2.6", "python", "train.py"]
这里 pt2.6 要和你的 environment.yml 里的环境名一致。
第三步:检查 environment.yml
很多从本机导出的 YAML 不能直接用于 Docker,需要清理两类内容:
prefix:这一行删掉
例如:
yaml
prefix: /home/linux/miniforge3/envs/pt2.6
这行必须删,不然 Docker 里路径不对。
- 过于本机绑定的包可以删掉
比如某些特别底层、只适合你当前机器的条目,有时会导致构建失败。
一个更适合 Docker 的 environment.yml 通常像这样:
yaml
name: pt2.6
channels:
- conda-forge
dependencies:
- python=3.10
- pip
第四步:构建镜像
bash
docker build -t pt2.6 .

第五步:运行容器
如果你要用 GPU:
bash
docker run --rm -it --gpus all pt2.6
如果只用指定 GPU,比如 0 和 1:
bash
docker run --rm -it --gpus '"device=0,1"' pt2.6
更实用的迁移方式
如果你的目标是"把现有训练项目环境迁到 Docker",我更建议你不要无脑完整迁移,而是"提炼环境":
- 用
conda list看核心包 - 只保留真正需要的依赖
- 在 Docker 里重建一个干净环境
因为直接导出的老环境常见问题是:
- 包太多
- 有平台残留
- 版本锁太死
- Docker 构建慢,还容易失败
你可以这样查当前环境依赖
bash
conda activate pt2.6
conda list
或者更聚焦一点:
bash
conda env export --from-history
如果你想"几乎原样迁移"
可以用:
bash
conda activate pt2.6
conda env export > environment_full.yml
然后手动删除:
prefix- 明显是系统路径绑定的项
- 不必要的构建号冲突项
再给 Docker 用。
建议你现在这样做
以 pt2.6 为例:
bash
conda activate pt2.6
conda env export --from-history > environment.yml
pip freeze > requirements.txt
然后用上面的 Dockerfile 重建。
如果你愿意,我可以下一步直接帮你生成一套可用文件。
你只要把下面任一项发我:
conda env export --from-history的输出conda env export的输出environment.yml文件内容
我可以直接帮你整理成:
- Docker 可用的
environment.yml - 对应
Dockerfile - GPU 版启动命令