Skip to content

访问本地文件夹

原文:https://docs.docker.com/guides/walkthroughs/access-local-folder/

本演练将向您展示如何从容器访问本地文件夹。为了更好地理解本演练中的一些概念,请首先完成运行多容器应用程序的演练。

Docker 将容器中的所有内容、代码和数据与您的本地文件系统隔离。默认情况下,容器无法访问您的本地文件系统中的目录。

数据隔离图

有时,您可能希望从本地文件系统访问一个目录。为此,您可以使用绑定挂载。

步骤 1: 获取示例应用程序

如果您有 git,可以克隆示例应用程序的仓库。否则,您可以下载示例应用程序。选择以下选项之一。

在终端使用以下命令克隆示例应用程序仓库。

bash
git clone https://github.com/docker/bindmount-apps

步骤 2: 使用 Compose 添加绑定挂载

添加一个绑定挂载以从容器访问您系统上的数据。绑定挂载允许您从主机的文件系统共享一个目录到容器中。

绑定挂载图

要在此项目中添加绑定挂载,请在代码或文本编辑器中打开 compose.yaml 文件,然后取消注释以下行。

yaml
todo-app:
  # ...
  volumes:
    - ./app:/usr/src/app
    - /usr/src/app/node_modules

volumes 元素指示 Compose 将本地文件夹 ./app 挂载到 todo-app 服务的容器中的 /usr/src/app。这种特定的绑定挂载覆盖了容器中 /usr/src/app 目录的静态内容,并创建了所谓的开发容器。第二个指令 /usr/src/app/node_modules 防止绑定挂载覆盖容器的 node_modules 目录,以保留容器中安装的包。

INFO

在 Docker Compose 的配置文件中,volumes部分用来定义容器与宿主机之间的数据卷映射。这是一个关键功能,因为它允许容器访问宿主机上的文件系统,并持久化数据。在上述配置片段中,有两个卷映射定义:

  1. - ./app:/usr/src/app

    • 这一行将宿主机的当前目录下的app子目录挂载到容器的/usr/src/app目录。这意味着容器内的/usr/src/app目录中的内容将会与宿主机中./app目录的内容同步。当你在宿主机上修改这个目录中的文件时,这些更改会实时反映到容器中。
  2. - /usr/src/app/node_modules

    • 这一行看上去有些不同,因为它只指定了容器内的路径。这实际上是创建了一个匿名卷。匿名卷用于容器内的数据持久化,但不会将数据保存到宿主机的特定位置。这里的用途通常是为了保留node_modules目录的内容,使其不受宿主机目录内容的影响(即使宿主机的对应目录被修改或删除)。这样做的好处是可以避免在宿主机和容器之间由于操作系统差异(如 Windows 和 Linux)导致的依赖文件兼容性问题。

总结来说,第一行使得源代码能在宿主机和容器之间同步更新,而第二行则确保了容器内的node_modules的独立性和一致性,避免了由于外部变化而引发的问题。这种设置在开发环境中特别有用,可以确保开发者的环境和生产环境保持一致。

步骤 3: 运行应用程序

在终端中运行以下命令来启动您的应用程序。将 /path/to/bindmount-apps/ 替换为您的应用程序目录的路径。

bash
cd /path/to/bindmount-apps/
bash
docker compose up -d

步骤 4: 开发应用程序

现在,您可以利用容器的环境在本地系统上开发应用程序。您在本地系统上对应用程序所做的任何更改都会反映在容器中。在您的本地目录中,打开 app/views/todos.ejs 在代码或文本编辑器中,更新 Enter your task 字符串,并保存文件。访问或刷新 localhost:3001 来查看更改。

总结

在这个演练中,您添加了一个绑定挂载以从容器访问本地文件夹。您可以使用这种方法在更新代码时无需重新构建容器即可加速开发。

相关信息: