Docker配置咨询:非root用户运行及挂载路径修改方案
问题解答
一、改为使用jovyan用户完成环境配置
原镜像tensorflow/tensorflow:latest-gpu-jupyter默认以jovyan用户运行,仅安装系统级依赖时需临时切换root,其余操作均可通过jovyan用户执行。修改后的Dockerfile如下:
FROM tensorflow/tensorflow:latest-gpu-jupyter # 临时切换root安装系统依赖 USER root # 安装基础工具与GDAL系统库,同时清理apt缓存减小镜像体积 RUN apt update && apt-get install -y --no-install-recommends \ python3 python3-pip gcc gdal-bin libgdal-dev build-essential wget && \ rm -rf /var/lib/apt/lists/* # 设置GDAL头文件全局环境变量 ENV CPLUS_INCLUDE_PATH=/usr/include/gdal ENV C_INCLUDE_PATH=/usr/include/gdal # 创建conda目录并赋予jovyan读写权限 ENV CONDA_DIR /opt/conda RUN mkdir -p $CONDA_DIR && chown jovyan:jovyan $CONDA_DIR # 切回jovyan用户执行后续操作 USER jovyan # 安装Miniconda并清理安装包 RUN wget --quiet https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda.sh && \ bash ~/miniconda.sh -b -p $CONDA_DIR && \ rm ~/miniconda.sh # 添加conda到全局PATH ENV PATH=$CONDA_DIR/bin:$PATH ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib/ # 升级pip并安装Python依赖 RUN pip3 install --upgrade pip && \ pip3 install tensorflow tensorflow_hub tensorflow_datasets && \ pip3 install GDAL==$(gdal-config --version) --global-option=build_ext --global-option="-I/usr/include/gdal" && \ pip3 install numpy matplotlib boto3 rasterio shapely scikit-learn scikit-image && \ pip3 install torch==1.7.1+cu110 torchvision==0.8.2+cu110 torchaudio==0.7.2 -f https://download.pytorch.org/whl/torch_stable.html
关键调整点:
- 仅在安装系统包时切换root,完成后立即切回jovyan
- 新增缓存清理步骤,缩小镜像体积
- 创建conda目录时赋予jovyan权限,避免后续读写报错
- 用
ENV设置全局环境变量,替代仅当前命令生效的RUN export - 所有Python包安装操作以jovyan用户执行,规避root权限警告
二、挂载路径限制的原因与修改方法
限制原因
tensorflow/tensorflow:latest-gpu-jupyter镜像默认将/tf设置为容器工作目录(WORKDIR),同时Jupyter Notebook的默认根目录也配置为/tf。启动容器后,Jupyter会自动加载该目录下的文件,因此只有挂载到/tf才能在Notebook中直接访问卷内内容。
修改挂载路径的方法
有两种干净的修改方式:
方法1:在Dockerfile中修改工作目录
在Dockerfile末尾添加工作目录配置,若为新建目录需提前在root权限下创建并赋权:
USER root RUN mkdir -p /your/custom/path && chown jovyan:jovyan /your/custom/path USER jovyan WORKDIR /your/custom/path
之后在docker-compose.yml中挂载到新路径:
services: tf-env: build: . volumes: - ./local-data:/your/custom/path ports: - "8888:8888"
方法2:启动容器时指定Jupyter根目录
无需修改Dockerfile,直接在docker-compose.yml中通过命令参数指定Jupyter的根目录:
services: tf-env: build: . volumes: - ./local-data:/your/custom/path ports: - "8888:8888" command: ["jupyter", "notebook", "--notebook-dir=/your/custom/path", "--ip=0.0.0.0", "--allow-root"]
这种方式无需重新构建镜像,灵活性更高。
内容的提问来源于stack exchange,提问作者fariadantes
相关产品推荐
相关产品推荐

