搞深度学习的人大概都经历过"这台机器能跑,换一台就崩"的痛苦。很早之前我就把项目的依赖都写进了一个 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 构建一次就行,不用再花半天时间去对齐环境了。