目前实验室众人在搭建 k8s,因为没有涉及 k8s 源码,所以可以看做原生的 k8s。除此之外,实验室还在用 openpai 平台(微软开发的,功能比较完善)。不过最近发现这两种方式对镜像的处理有区别,主要体现在环境变量上:
以下面这些环境变量为例,
FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04
SHELL ["/bin/bash", "-c"]
WORKDIR /root/
ENV DEBIAN_FRONTEND noninteractive
ENV LC_ALL C.UTF-8
ENV LANG C.UTF-8
RUN mkdir test
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/root/.mujoco/mujoco210/bin
ENV PATH $PATH:/root/.mujoco/mujoco210/bin
ENV WORKON_HOME /root/.virtualenvs
ENV VIRTUALENVWRAPPER_VIRTUALENV /usr/local/bin/virtualenv
ENV VIRTUALENVWRAPPER_PYTHON /usr/bin/python3.7
对于原生 k8s,创建容器后,dockerfile 中所有使用 ENV 声明的环境变量都是可以正常使用的,但是使用如果把变量写在 .bashrc 或者 .zshrc 中则无效,即使使用 source .zshrc
也不行。(注意,这里的提到的正常使用和无效都是针对任务 yaml 中的命令,如果 ssh 或者 kubectl exec 进入容器则不存在这个问题)
对于 openpai,上面的环境变量只有 LD_LIBRARY_PATH 和 PATH 会生效,其他全部无效,但是使用如果把变量写在 .bashrc 或者 .zshrc 中则有效。推测是,openpai 修改了 k8s 源码,对镜像层进行了过滤,删除了非标准环境变量的层。
所以建议,环境变量既用 ENV 声明,又写入 .bashrc 或者 .zshrc 中。