当我执行
docker compose up -d
时,我希望能够在Web浏览器中的本地主机5123上运行我的Flask应用程序,并在本地主机8123上运行Jupyter服务器。我想使用 Jupyter 服务器来测试一些我最终将在 Flask 应用程序中使用的代码。 Jupyter 笔记本应该可以访问我在 Flask 应用程序中安装的相同软件包(例如特定版本的 numpy、pandas 等)
如何实现这一目标?
到目前为止我尝试过的:
jupyter/minimal-notebook
图像撰写文件。它可以工作(有点),但是我的基本映像中的包需要在每个 jupyter 笔记本中重新安装? 我在下面包含了 Dockerfile 和 compose.yml 文件。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 安装或设置相关。 (例如,从主机系统绑定安装虚拟环境肯定行不通。)
但是,您可以创建 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: