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
进程,可以处理SIGTERM
和SIGKILL
信号,确保容器能正确终止。 - 这里:
- 使用
ADD
命令下载tini
并放入/usr/bin/tini
目录。 -
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+C
和SIGTERM
正常工作。
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 主要做了以下工作:
- 以
ngsxfem/ngsxfem:latest
作为基础镜像。 - 创建
jovyan
用户,并将其home
目录的权限赋给它。 - 安装
tini
作为init
进程,确保容器能正确终止。 - 安装 Jupyter Notebook 及相关扩展(如
codefolding
、toc2
)。 - 启用 Jupyter Notebook,并设置默认启动命令。
你可以用以下命令构建和运行这个 Docker 镜像:
docker build -t my-jupyter .
docker run -p 8888:8888 my-jupyter
然后在浏览器打开 http://localhost:8888
,输入 Jupyter 生成的 token,即可访问 Jupyter Notebook。