如何与 Jupyter 中的另一个 Docker 镜像共享安装在我的 Docker 基础镜像中的 python 包?

问题描述 投票:0回答:1

当我执行

docker compose up -d
时,我希望能够在Web浏览器中的本地主机5123上运行我的Flask应用程序,并在本地主机8123上运行Jupyter服务器。我想使用 Jupyter 服务器来测试一些我最终将在 Flask 应用程序中使用的代码。 Jupyter 笔记本应该可以访问我在 Flask 应用程序中安装的相同软件包(例如特定版本的 numpy、pandas 等)

如何实现这一目标?

到目前为止我尝试过的:

  1. 使用我的基础图像(Flask + TailwindCSS)和
    jupyter/minimal-notebook
    图像撰写文件。它可以工作(有点),但是我的基本映像中的包需要在每个 jupyter 笔记本中重新安装? 我在下面包含了 Dockerfile 和 compose.yml 文件。
  2. 撰写文件中的基础映像相同,但随后我收到错误来自守护程序的错误响应:无法为容器创建任务:无法创建垫片任务:OCI运行时创建失败:runc创建失败:无法启动容器进程:exec: “jupyter”:在 $PATH 中找不到可执行文件:未知。我的requirements.txt文件确实包含
    jupyter==1.0.0
    和另外10个jupyter和jupyterlab包

我的基础镜像的 Dockerfile(Flask+TailwindCSS+DaisyUI,最后两个通过 npm 安装):

# Stage 1: Build Python dependencies
FROM python:3.11-slim AS builder

RUN apt-get update && apt-get install -y gcc

WORKDIR /app

COPY requirements.txt ./

# RUN pip install -r requirements.txt
RUN pip install --upgrade pip && pip install -r requirements.txt

# # Check if Flask is installed
# RUN python -c "import flask; print('Flask installed successfully')"

# Stage 2: Build Node.js dependencies
FROM node:18-alpine AS node-builder

WORKDIR /app

COPY package.json ./

RUN npm install

# Stage 3: Final image with both dependencies
FROM python:3.11-slim

WORKDIR /app

COPY --from=builder /app /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY --from=node-builder /app/node_modules /app/node_modules

# Expose the port
EXPOSE 5000

还有我的 compose.yml 文件:

services:
  web:
    build: .
    command: python app.py runserver 0.0.0.0:5000
    volumes:
      - .:/app
    ports:
      - "5123:5000"


  jupyter:
    image: jupyter/minimal-notebook
    environment:
      - JUPYTER_TOKEN=iambatman
    volumes:
      - ./:/home/jovyan/
      - ../python_env:/usr/local/share/jupyter/kernels/python3
    ports:
      - "8123:8888"
    command: jupyter lab --ip=0.0.0.0 --port=8888

我不是 Docker 专家,非常感谢任何帮助!

python docker flask docker-compose jupyter-notebook
1个回答
0
投票

您无法在容器之间共享文件。 对于像库这样的东西来说更是如此,这些库是应用程序代码库的一部分,并且可能与特定的 Python 安装或设置相关。 (例如,从主机系统绑定安装虚拟环境肯定行不通。)

但是,您可以创建 Dockerfile

FROM
任何您想要的图像。 它可以帮助查找和读取基础镜像的 Dockerfile; Jupyter 图像位于here。 查找相应的文档也很有用; Jupyter Docker Stacks 文档 注释

jovyan
用户对
/opt/conda
目录具有完全读/写访问权限。您可以使用
mamba
pip
conda
(建议使用
mamba
)来安装新软件包,无需任何额外权限。

按照其示例,您可以构建一个自定义图像,例如

FROM quay.io/jupyter/minimal-notebook
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt && \
    fix-permissions "${CONDA_DIR}" && \
    fix-permissions "/home/${NB_USER}" && \
    rm requirements.txt

(这是整个 Dockerfile,常见的元数据如

USER
CMD
是从基础镜像继承的。)

这不会与主应用程序映像“共享库”本身,但由于它使用相同的 Pip 依赖项锁定文件,因此您应该在两个映像中获得相同的库。

在 Compose 文件中,您需要告诉 Compose 构建此映像,而不仅仅是使用上游映像。 同样,您不需要卷来注入或覆盖这些库,因为它们包含在映像中。

  jupyter:
    build:
      context: .
      dockerfile: Dockerfile.jupyter
    environment:
      - JUPYTER_TOKEN=iambatman
    volumes:
      - ./:/home/jovyan/
    ports:
      - "8123:8888"
    # no image:, shouldn't need to override command:
© www.soinside.com 2019 - 2024. All rights reserved.