【问题标题】:Mount volume with docker-compose for Jupyter and RStudio instance使用 docker-compose 为 Jupyter 和 RStudio 实例挂载卷
【发布时间】:2019-11-15 18:59:54
【问题描述】:

我正在学习 Docker,并设法使用 docker-compose 创建一个 RStudio 实例 和一个 Jupyter Notebook 实例来构建图像。 虽然我可以登录并从实例创建脚本,但我注意到这些脚本没有“永久”保存,我无法在我的主文件夹 /home/rstudio_scriptshome/jupyter_scripts 中找到它们。

我了解到,为了使在这些实例中创建的脚本/数据即使在 docker 容器关闭后也能“持久化”,您需要挂载卷。

所以我尝试在下面的 docker-compose.yml 中挂载卷并为 RStudio 和 Jupyter 创建一个特定文件夹:

但显然有问题,因为文件夹和数据都没有出现。

我的 docker-compose.yml 和 RStudio 的 Dockerfile 都在一个名为 Docker 的文件夹中,我在这个文件夹中正在构建镜像 docker build -t general_docker .

我还希望在 Rstudio 或 Jupyter 实例中创建的任何数据都可以由两个实例读取/写入,但我不知道在容器运行后是否应该使用类似 chmod 777 ... 的东西。

非常感谢任何帮助!

编辑 1:让我附上更新后的 docker-compose.yml。以下允许我在主目录中创建一个名为 R_and_Jupyter_scripts 的新文件夹,其中包含我的所有脚本,可以在我的 Rstudio 实例和 Jupyter 笔记本中访问。但我希望从 Jupyter 或 RStudio 实例创建的任何新脚本在执行“docker-compose down”后都不会消失。我应该更改 docker-compose.yml 的哪一部分?

version: "3.5"
services:
  rstudio:
    environment:
      - USER=username
      - PASSWORD=password
    image: "rocker/tidyverse:latest"
    build:
     context: ./
     dockerfile: Dockerfile
    volumes:
      - $HOME/R_and_Jupyter_scripts:/home/rstudio/r_scripts
    container_name: rstudio
    ports:
     - 8787:8787

  jupyter:
    image: 'jupyter/datascience-notebook:latest'
    ports:
     - 8888:8888
    volumes:
      - $HOME/R_and_Jupyter_scripts:/home/jovyan/work
    container_name: jupyter

编辑 2:

我已经编辑了上面的代码,只在卷中写入绝对路径(见下文),但仍然没有做我需要的。

我从 RStudio 创建了一个文本文件 output.txt,当我创建 sudo find / -name "output.txt" 时,我希望该文件位于 /home/ec2-user/R_and_Jupyter_scripts 但它最终位于两个不同的地方,看起来像是仍在容器本身中的文件夹:

/var/lib/docker/overlay2/66513c53c04786298cac012ea032be58d434131ce04e73f75bf63ca1d0e358d6/diff/home/maxence/r_scripts/output.txt

/var/lib/docker/overlay2/66513c53c04786298cac012ea032be58d434131ce04e73f75bf63ca1d0e358d6/merged/home/maxence/r_scripts/output.txt

docker-compose.yml:

version: "3.5"
services:
  rstudio:
    environment:
      - USER=username
      - PASSWORD=password
    image: "rocker/tidyverse:latest"
    build:
     context: ./
     dockerfile: Dockerfile
    volumes:
      - /home/ec2-user/R_and_Jupyter_scripts:/home/rstudio/r_scripts
    container_name: rstudio
    ports:
     - 8787:8787

  jupyter:
    image: 'jupyter/datascience-notebook:latest'
    ports:
     - 8888:8888
    volumes:
      - /home/ec2-user/R_and_Jupyter_scripts:/home/jovyan/work
    container_name: jupyter

【问题讨论】:

  • 请勿发布代码图片。粘贴代码本身,修改图像中修改的任何密码等。

标签: r docker docker-compose jupyter-notebook docker-volume


【解决方案1】:

volume 定义在容器内部创建文件夹。如果要在 Docker 主机上挂载文件夹,则必须提供该主机文件夹的完整路径;仅相对本地文件夹名称是不够的。

您发布的配置使用“命名卷”,而不是安装主机卷。它的作用与磁盘映像足够接近;当您运行docker volume ls 时,Docker 将引用{PROJECT}_Docker 卷。这会将文件夹的内容保存在其他地方,除非通过安装在其他 Docker 容器中,否则通常无法访问。

如果您想托管卷挂载,请删除 Compose 文件末尾的 volumes: 部分,而是在每个服务定义中添加类似

volumes:
  - /home/ML_Enthousiast/my_project/Docker:/home/rstudio_scripts

【讨论】:

  • 感谢@wmorrell 我删除了“命名卷”并更新了上面的脚本。尽管我应该在最初的帖子中更清楚地提及,但我需要的是,即使我执行 docker-compose down,任何创建的新数据或脚本仍然是“持久的”。
  • 写入通过volumes 挂载的目录的数据将持久保存到该卷。我建议您查看有关卷的 Docker 文档,它应该有助于了解正在发生的事情。我认为您更新的配置不起作用,volumes 键下的值必须是冒号分隔的字符串,第一部分是命名卷或主机上的绝对路径,第二部分是路径 在卷可用的容器内,以及带有挂载选项的可选第三方(例如只读)。我认为$HOME 无效,请使用真实路径。
  • 谢谢@wmorrell,我用绝对路径和更多信息更新了脚本。我已经阅读了 docker volumes 教程,但找不到对我来说很明确的教程。
  • 从您的更新中,听起来容器从未重新创建,并且您仍在使用从原始配置启动的容器,并具有命名卷。这已经到了在 cmets 中来回走动不再有帮助的地步。试着找一个可以亲自坐下来解决问题的人,或者在 Docker 上注册一个课程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多