ngxfem dockerfile

你的 Dockerfile 主要是基于 ngsxfem/ngsxfem:latest 镜像,构建一个支持 Jupyter Notebook 并带有多种扩展的环境。下面是逐行解释:


基础镜像

FROM ngsxfem/ngsxfem:latest
  • 这里 FROM 指定了基础镜像,ngsxfem/ngsxfem:latest 是基于 NGSXFEM(Netgen/NGSolve 的 FEM 扩展)的官方镜像。
  • latest 表示使用该镜像的最新版本。

设置构建参数

ARG NB_USER=jovyan
ARG NB_UID=1000
  • ARG 用于定义 Docker 构建时的变量:
    • NB_USER:容器内的默认用户名,设为 jovyan(Jupyter Notebook 默认用户)。
    • NB_UID:容器内该用户的 UID,设为 1000
ENV USER ${NB_USER}
ENV NB_UID ${NB_UID}
ENV HOME /home/${NB_USER}
  • ENV 定义环境变量:
    • USER:设置当前用户为 jovyan
    • NB_UID:传递 NB_UID 变量的值(即 1000)。
    • HOME:定义用户的 HOME 目录,/home/jovyan

拷贝文件

COPY . ${HOME}
  • COPY . ${HOME} 将当前目录(构建上下文中的文件)复制到容器的 /home/jovyan 目录。

切换到 root 用户

USER root
  • 由于某些安装和权限修改需要 root 权限,这里切换到 root。

安装 tini

ENV TINI_VERSION v0.6.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /usr/bin/tini
RUN chmod +x /usr/bin/tini
  • Tini 是一个简单的 init 进程,可以处理 SIGTERMSIGKILL 信号,确保容器能正确终止。
  • 这里:
    1. 使用 ADD 命令下载 tini 并放入 /usr/bin/tini 目录。
    2. chmod +x 赋予 tini 可执行权限。

更改目录权限

RUN chown -R ${NB_UID} ${HOME}
  • chown -R 递归更改 /home/jovyan 目录的所有者,使 jovyan 用户可以完全控制自己的 home 目录。

安装 Jupyter Notebook 相关扩展

RUN pip3 install jupyter_contrib_nbextensions
RUN pip3 install jupyter_nbextensions_configurator
RUN pip3 install RISE
RUN pip3 install ipywidgets
  • pip3 install 通过 pip 安装 Python 依赖:
    • jupyter_contrib_nbextensions:Jupyter 的贡献扩展,提供代码折叠、TOC、隐藏菜单等功能。
    • jupyter_nbextensions_configurator:提供 Jupyter Notebook 扩展的可视化管理工具。
    • RISE:Jupyter Notebook 的演示插件,可以把 Notebook 转换为幻灯片。
    • ipywidgets:支持交互式控件(如滑块、按钮等)的 Jupyter 扩展。

切换回非 root 用户

USER ${NB_USER}
  • 安装完成后,切换回 jovyan 用户,避免容器内的 Jupyter Notebook 进程以 root 运行,增强安全性。

设置工作目录

WORKDIR /home/${NB_USER}
  • 进入 jovyan 用户的 home 目录,确保接下来的命令在该目录下执行。

启用 Jupyter Notebook 扩展

RUN jupyter contrib nbextension install --user
RUN jupyter nbextensions_configurator enable --user
  • jupyter contrib nbextension install --user 安装 Jupyter Notebook 扩展(只针对当前用户)。
  • jupyter nbextensions_configurator enable --user 启用扩展管理器。
RUN jupyter nbextension enable codefolding/main
RUN jupyter nbextension enable scratchpad/main
RUN jupyter nbextension enable toc2/main
# RUN jupyter nbextension enable varInspector/main
RUN jupyter nbextension enable hide_header/main
RUN jupyter nbextension enable --py widgetsnbextension
  • 逐个启用 Notebook 扩展:
    • codefolding/main:代码折叠功能。
    • scratchpad/main:提供临时记事本功能。
    • toc2/main:自动生成目录(Table of Contents)。
    • hide_header/main:隐藏 Notebook 界面的标题栏。
    • widgetsnbextension:启用 ipywidgets 支持(可创建交互式控件)。
    • varInspector/main(被注释掉):变量查看器。

启动命令

ENTRYPOINT ["/usr/bin/tini", "--"]
  • 设置 ENTRYPOINT,确保容器启动时 tini 作为 init 进程,避免 PID 1 问题,使 CTRL+CSIGTERM 正常工作。
CMD ["jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--allow-root"]
  • CMD 指定容器启动时执行的命令:
    • jupyter notebook:启动 Jupyter Notebook。
    • --port=8888:监听 8888 端口(默认)。
    • --no-browser:不自动在浏览器打开 Notebook(因为容器通常在服务器运行)。
    • --ip=0.0.0.0:监听所有网络接口,允许外部访问。
    • --allow-root:允许 root 运行 Jupyter(但这里 USER 已经是 jovyan,该选项其实无影响)。

总结

这个 Dockerfile 主要做了以下工作:

  1. ngsxfem/ngsxfem:latest 作为基础镜像。
  2. 创建 jovyan 用户,并将其 home 目录的权限赋给它。
  3. 安装 tini 作为 init 进程,确保容器能正确终止。
  4. 安装 Jupyter Notebook 及相关扩展(如 codefoldingtoc2)。
  5. 启用 Jupyter Notebook,并设置默认启动命令。

你可以用以下命令构建和运行这个 Docker 镜像:

docker build -t my-jupyter .
docker run -p 8888:8888 my-jupyter

然后在浏览器打开 http://localhost:8888,输入 Jupyter 生成的 token,即可访问 Jupyter Notebook。