用 Dockerfile 搭一个可复现的深度学习环境

搞深度学习的人大概都经历过"这台机器能跑,换一台就崩"的痛苦。很早之前我就把项目的依赖都写进了一个 environment.yml,但真的要让环境完全一致、换个地方也能一键拉起,还是得上 Docker。

下面这个方案用的基础镜像是 ubuntu:22.04,在上面装 Miniconda,再把 environment.yml 里的环境建好。

网络部分全换成了清华源,不然在国内构建的时候能卡到你怀疑人生。

完整的 Dockerfile 我放在后面了,先说一下每一步在做什么。

基础镜像选了 Ubuntu 22.04。环境变量里把 DEBIAN_FRONTEND 设成 noninteractive,省得装包的时候弹交互界面卡住构建。

接着把 apt 源替换成清华镜像,然后一口气装了一堆依赖------wget、bzip2、libgl1-mesa-glx,还有编译 Python 时常见的那些 dev 包,什么 libssl-dev、libffi-dev、libbz2-dev 等等。这些东西不全的话后面 conda 环境可能会出现一些莫名其妙的报错,别问我怎么知道的。最后顺手把时区设成了 Asia/Shanghai。

Miniconda 是直接 wget 清华镜像站上的最新安装包,-b -p 指定安装到 /opt/conda,这样不用交互确认。环境变量 PATH 里加上 /opt/conda/bin,后续 conda 命令就能直接用了。conda 的 channel 也切成清华源,main、free、conda-forge 都加上了,不然装包的时候又会慢得想砸键盘。

conda init bash 之后,我习惯把 SHELL 指令改成 "/bin/bash", "-c",保证后面 RUN 都是在 bash 下执行。

然后把项目里的 environment.yml 拷进 /tmp,用 conda env create -f 创建环境。环境名叫 GraphReasoning,所以顺便在 .bashrc 里加了一句 conda activate GraphReasoning,这样容器启动后直接进入 bash 就能自动激活环境。CMD 就保留默认的 /bin/bash。

完整的 Dockerfile 如下:

复制代码
# 使用Ubuntu 22.04作为基础镜像
FROM ubuntu:22.04

# 设置环境变量以避免交互式配置
ENV DEBIAN_FRONTEND=noninteractive

# 修改APT源为清华大学的镜像源
RUN sed -i 's|http://archive.ubuntu.com/ubuntu/|http://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' /etc/apt/sources.list && \
    sed -i 's|http://security.ubuntu.com/ubuntu/|http://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' /etc/apt/sources.list

# 更新包列表并安装必要的依赖
RUN apt-get update && \
    apt-get install -y --no-install-recommends tzdata \
    wget \
    bzip2 \
    libgl1-mesa-glx \
    software-properties-common \
    build-essential \
    zlib1g-dev \
    libbz2-dev \
    libssl-dev \
    libncurses5-dev \
    libncursesw5-dev \
    libreadline-dev \
    libsqlite3-dev \
    libgdbm-dev \
    libdb5.3-dev \
    liblzma-dev \
    tk-dev \
    libffi-dev \
    curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 设置时区为上海时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
     echo "Asia/Shanghai" > /etc/timezone

# 下载并安装Miniconda
RUN wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \
    bash ~/miniconda.sh -b -p /opt/conda && \
    rm ~/miniconda.sh

# 配置conda环境变量
ENV PATH=/opt/conda/bin:$PATH

# 将conda源设置为清华源
RUN conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ && \
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ && \
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

# 初始化conda shell
RUN conda init bash

# 设置默认shell为连接conda的shell
SHELL ["/bin/bash", "-c"]

# 复制environment.yml文件到容器中
COPY environment.yml /tmp/environment.yml

# 创建conda环境
RUN conda env create -f /tmp/environment.yml && \
    echo "conda activate GraphReasoning" >> ~/.bashrc

# 设置默认命令
CMD ["/bin/bash"]

构建和运行非常简单。在 Dockerfile 和 environment.yml 所在的目录执行:

不想被证书过期打乱业务节奏?来此加密提供自动重新申请机制,配合微信小程序随时查看证书状态。支持100个域名单张证书,IP证书也全覆盖,让安全永不掉线。

复制代码
docker build -t graph-reasoning-env .

跑完之后用下面这个命令启动容器,进去就是 GraphReasoning 环境了:

复制代码
docker run -it graph-reasoning-env /bin/bash

整个流程就这么回事。后面如果再有人加入项目,或者自己换机器,直接拿着这份 Dockerfile 和 environment.yml 构建一次就行,不用再花半天时间去对齐环境了。