使用 Docker 桌面的 WSL2 上的 Docker 卷

Nei*_*oFR 10 docker docker-compose docker-volume windows-subsystem-for-linux docker-desktop

我只是在 Docker for Windows 上试用 WSL 2,但我在安装卷时遇到了问题:

version: "3.7"

services:
    node:
        build: .
        container_name: node
        hostname: node
        volumes: 
            - ./app:/app
        stdin_open: true
Run Code Online (Sandbox Code Playgroud)

容器构建并启动良好,我使用 docker exec 很好地访问它,但/app容器内的文件夹未绑定到我的笔记本电脑app文件夹。但是,正确的路径实际上已正确安装在正在运行的容器上:

(这里我在主机上执行密码,如果它与容器上安装的内容完美匹配)

?  app pwd   
/mnt/c/Users/willi/devspace/these/app
Run Code Online (Sandbox Code Playgroud)

这是 portainer 的屏幕,它告诉我在容器中安装了哪些路径并且一切都匹配。

来自 portainer 的 docker 卷

我在主机上的 app 文件夹中创建的文件在容器的 app 文件夹中不可见,反之亦然。这很奇怪,我不知道如何调试它。

补充资料:

  • Windows 10 专业版 10.0.19041
  • Docker for Windows 版本:2.3.0.4
  • docker version WSL 中的输出:19.03.12
  • docker-compose version : 1.26.2

谢谢

小智 14

正如@Pablo 所提到的,最佳实践似乎是使用 WSL 文件系统来映射卷。

查看有关 WSL2Docker 文档

最佳实践

  1. 要在绑定挂载文件时充分利用文件系统性能:
    • docker run -v <host-path>:<container-path>在 Linux 文件系统而不是 Windows 文件系统中存储绑定安装到 Linux 容器(即,使用)的源代码和其他数据。
    • 如果原始文件存储在 Linux 文件系统中,Linux 容器只会接收文件更改事件(“inotify 事件”)。
    • 当文件从 Linux 文件系统绑定挂载而不是从 Windows 主机远程安装时,性能要高得多。因此避免docker run -v /mnt/c/users:/users/mnt/c从 Windows 安装的位置)。
    • 相反,从 Linux shell 使用类似docker run -v ~/my-project:/sources <my-image>where的命令~被 Linux shell 扩展为$HOME.
  2. 如果您担心 docker-desktop-data VHDX 的大小,或需要更改它,请查看 Windows 内置的 WSL 工具。
  3. 如果您担心 CPU 或内存使用情况,您可以配置对分配给 WSL 2 实用程序 VM 的内存、CPU、交换大小的限制。
  4. 为了避免在 Docker 桌面上使用 WSL 2 的任何潜在冲突,在安装 Docker 桌面之前,您必须卸载通过 Linux 发行版直接安装的任何先前版本的 Docker 引擎和 CLI。

  • 按照建议将文件从 Windows 文件系统复制到主 (~/) 目录下的 WSL 后,该目录中的文件仍然没有显示在我的容器中 - 我得到一个空目录。我尝试对文件执行 chmod 777,但仍然没有成功。 (3认同)

Nei*_*oFR 5

现在一切正常,看来我的问题是我的 WSL 发行版仍然是版本 1。您可以使用以下命令验证它: wsl -l -v

  NAME                   STATE           VERSION
* docker-desktop-data    Stopped         2
  docker-desktop         Stopped         2
  Ubuntu-20.04           Running         2 <- This was at 1
Run Code Online (Sandbox Code Playgroud)

升级到 WSL2