docker 使用 docker 工具箱从 wsl 安装空卷(如果是文件夹)

docker compose empty volumes (if folder) mount from wsl using docker toolbox

我正在 运行宁 docker 编写命令 运行 docker 中的应用程序。但是,yml 中定义的卷是空的。如果我挂载单个文件,它就可以工作。但是,当我从 windows 挂载一个目录时,我可以看到该目录,但它是空的。

这是我的 docker-compose 命令。

docker-compose -f docker-compose.dev.yml -f docker-compose.test.yml -f docker-compose.test.local.yml run --rm app /bin/sh

下面是我的yml文件的内容:

version: "3"
services:
  app:
    environment:
      - NODE_ENV=test
      - TEST_DB_HOSTNAME=database
      - DB_HOSTNAME=database
      - DB_MIGRATE_ENV=test-docker
    volumes:
      - .jshintignore:/home/test_app/src/.jshintignore
      - .jshintrc:/home/test_app/src/.jshintrc
      - ./nuke-rebuild-test-db.js:/home/gofar/src/nuke-rebuild-test-db.js
      - ./test_folder:/home/test_app/src/test_folder
      - ./database:/home/test_app/src/database
      - ./server:/home/test_app/src/server
      - ./common:/home/test_app/src/common
      - ./coverage:/home/test_app/src/coverage

从上面,nuke-rebuild-test-db.js 文件被复制到容器中。我也可以看到 test_folder。但是,如果我查看文件夹内部,它是空的。

以下是我为使 docker 在我的 Windows 10 Home 系统中工作所做的工作,我有 docker 工具箱。

下面是将 windows 机器中的 Ubuntu WSL 与 Docker 工具箱连接起来的配置。

为了让我的根目录与 linux 兼容,我在 /etc/wsl.conf 文件中添加了以下内容

[automount]
root = /
options = "metadata"

即使正在装载单个文件,我也已将我的应用程序文件夹添加到 Oracle VM Virtual Box 的共享文件夹列表中。

谢谢。

如果您 运行 docker-compose 所在的目录是 WSL /home 目录,这将不起作用。

您需要在 WSL 文件系统之外拥有文件,这些文件将映射到 docker 已装载的图像 windows 共享。默认情况下,docker 工具箱将 windows C 挂载到 boot2docker VM 中的 /c。这就是为什么在 WSL 中建议添加 /root automount。因此,您的 C: 驱动器将位于 /c 中。但是没有人写过 wsl 中的 /home 和 windows docker 工具箱中的卷挂载(它使用 Virtual Box 图像 docker )

这里已经讨论过同样的问题: https://superuser.com/questions/1344407/docker-on-wsl-wont-bind-mount-home/1378927

https://github.com/docker/for-win/issues/2151

我遇到了一个非常相似的错误,结果证明这是安装在 WSL 中的 docker-compose 的问题。 WSL 中安装的 docker-compose 版本未正确处理卷绑定。这是通过从 WSL 安装中删除 /usr/local/bin/docker-compose 而改为别名 windows exe alias docker-compose="/mnt/c/Program\ Files/Docker/Docker/resources/bin/docker-compose.exe"

来解决的