【问题标题】:Django shell_plus: How to access Jupyter notebook in Docker ContainerDjango shell_plus:如何在 Docker 容器中访问 Jupyter 笔记本
【发布时间】:2020-09-23 08:27:42
【问题描述】:

我正在尝试从 Docker 容器中的 django-extensions 访问使用 shell_plus 命令创建的 Jupyter Notebook。

docker-compose -f local.yml run --rm django python manage.py shell_plus --notebook

我的配置基于@RobM 和@Mark Chackerian 对此Stack Overflow question 的回答。 IE。我安装并配置了一个自定义内核,我的 Django 应用程序配置文件将常量 NOTEBOOK_ARGUMENTS 设置为:

NOTEBOOK_ARGUMENTS = [
    '--ip', '0.0.0.0',
    '--port', '8888',
    '--allow-root',
    '--no-browser',
]

在日志中可以看到容器启动成功:

[I 12:58:54.877 NotebookApp] The Jupyter Notebook is running at:
[I 12:58:54.877 NotebookApp] http://10d56bab37fc:8888/?token=b2678617ff4dcac7245d236b6302e57ba83a71cb6ea558c6
[I 12:58:54.877 NotebookApp]  or http://127.0.0.1:8888/?token=b2678617ff4dcac7245d236b6302e57ba83a71cb6ea558c6

但我无法打开网址。我已经在docker-compose 中转发了端口 8888,尝试使用 localhost 而不是 127.0.0.1,并且还尝试使用容器 IP 没有成功。

感觉好像我在这里遗漏了明显的东西......感谢任何帮助。

【问题讨论】:

    标签: python django docker-compose jupyter-notebook django-extensions


    【解决方案1】:

    为了截至 2020 年的记录,我设法在docker-compose 中使用Postgresql 设置了一个有效的django:

    development.py (settings.py)

    INSTALLED_APPS += [
        "django_extensions",
    ]
    
    SHELL_PLUS = "ipython"
    
    SHELL_PLUS_PRINT_SQL = True
    
    NOTEBOOK_ARGUMENTS = [
        "--ip",
        "0.0.0.0",
        "--port",
        "8888",
        "--allow-root",
        "--no-browser",
    ]
    
    IPYTHON_ARGUMENTS = [
        "--ext",
        "django_extensions.management.notebook_extension",
        "--debug",
    ]
    
    IPYTHON_KERNEL_DISPLAY_NAME = "Django Shell-Plus"
    
    SHELL_PLUS_POST_IMPORTS = [ # extra things to import in notebook
        ("module1.submodule", ("func1", "func2", "class1", "etc")),
        ("module2.submodule", ("func1", "func2", "class1", "etc"))
    
    ]
    
    os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true" # only use in development 
    

    requirements.txt

    django-extensions
    jupyter
    notebook
    Werkzeug  # needed for runserver_plus
    ...
    

    docker-compose.yml

    version: "3"
    
    services:
      db:
        image: postgres:13
        environment:
          - POSTGRES_HOST_AUTH_METHOD=trust
        restart: always
        ports:
          - "5432:5432"
        volumes:
          - postgres_data:/var/lib/postgresql/data/
      web:
        build: .
        environment:
          - DJANGO_SETTINGS_MODULE=settings.development
        command:
          - scripts/startup.sh
        volumes:
          - ...
        ports:
          - "8000:8000" # webserver 
          - "8888:8888" # ipython notebook
        depends_on:
          - db
    
    volumes:
      postgres_data:
    

    从您的主机终端运行以下命令:

    docker-compose exec web python manage.py shell_plus --notebook
    

    最后在主机的网络浏览器中导航到http://localhost:8888/?token=<xxxx>。

    【讨论】:

    • 基本部分是NOTEBOOK_ARGUMENTS,并在容器外部映射端口8888(例如-p参数)。
    • @n1_ db 语句也需要异步部分
    • @n1_ 需要 django 3.0
    【解决方案2】:

    让它工作,但它为什么这样做是我无法理解的。在docker-compose run 命令中公开端口就可以了。

    docker-compose -f local.yml run --rm -p 8888:8888 django python manage.py shell_plus --notebook
    

    我的印象是在我的local.yml 中暴露端口也会在run 启动的容器中打开它们。

    【讨论】:

    • 我提供的 MWE 为 docker-compose、django、notebook。
    • 谢谢。周一去看看吧我的解决方案的奇怪之处在于,尽管笔记本可以启动并且可以在浏览器中访问,但没有任何 shell plus 功能可用,即。 e.模块加载和东西。我实际上无法加载我的应用的任何模型。
    • run 将启动一个新容器,我认为您应该使用exec。所有shell_plus 功能都可以在提供的解决方案中访问。
    • 好的。它似乎有效,虽然我无法登录笔记本。令牌将不被接受。这看起来很奇怪,我所做的就是导航到令牌丰富的 url。你知道为什么会这样吗? ...当然,我也尝试手动输入令牌。
    • 重新启动,笔记本现在启动。但是我的run 解决方案遇到了与以前相同的AppRegistryNotReady: Apps aren't loaded yet. 错误。
    【解决方案3】:

    如果你想使用 jupyter notebook 之类的分离服务:

    jupyter_notebook:
      build:
        context: .
        dockerfile: docker/dev/web/Dockerfile
      command: python manage.py shell_plus --notebook
      depends_on:
        - web
      ports:
      - 8888:8888 # ipython notebook
      env_file:
        - .env
    

    之后:

    docker-compose logs -f 'jupyter_notebook'
    

    您将在日志中获得访问令牌

    【讨论】:

    • 嗨班迪罗姆。请多解释一下你的答案。我们应该如何处理您回答中提供的 YAML?为什么这样做有助于打开原始发帖人试图打开的 URL?楼主好像已经有访问令牌了,但是打不开网址。
    • 嗨@SethDifley!您可以在类似服务的 docker-compose.yml 中为您的笔记本创建单独的实例。
    • 在上面的回答中,您应该手动启动 jupyter。在此解决方案中,您已经运行了一个笔记本
    猜你喜欢
    • 2019-04-11
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2018-02-26
    • 2023-01-15
    • 1970-01-01
    相关资源
    最近更新 更多