通常,当使用 Docker-in-Docker 查找 Overlay2 驱动程序的绑定安装路径时,我可以通过以下方式完成:
$ docker run --rm -it --entrypoint bash \
-v /var/run/docker.sock:/var/run/docker.sock \
gcr.io/cloud-builders/docker
$ apt-get install jq -y
$ mount_point=$(docker inspect $HOSTNAME | jq -r '.[0].GraphDriver.Data.MergedDir')
$ echo "$mount_point"
/var/lib/docker/overlay2/c68a6fc53a27d6347e691a52bdd792094a7a4fdc65041b387d1ea38607ba999d/merged
$ mkdir hello && cd hello
$ echo "sample contents" > file
$ docker run --rm -it --entrypoint bash \
-v "$mount_point/hello":/hello \
-w /hello \
gcr.io/cloud-builders/docker
$ ls
# nothing
Run Code Online (Sandbox Code Playgroud)
对于除 WSL2 之外的所有内容,这将正确挂载我的文件。但是,对于 WSL2,绑定安装似乎存在于不同的位置。如果我附加的 WSL2 发行版名称是Ubuntu-22.04,我可以在下面找到唯一 IDS 的列表/mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04/:
$ ls /mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04/
13a7bc88b63d361f5752d7ef3f5c96cd262ef580e6f435cced6bd10ec82842b0 692b88d87549cc6cb71d70e56b24d64d46c6e4f3b54611d635e407941a34d5da
21241f82d3c1e170eae05d87ed4fe9493165603a5f20f4decc5da0695296a22b 71329c4cc6e32171553fa81d044eb31d1a3aac52ba9376c4a99f4505c494cf5b
2af2028475f25893cbe6ae56fd41a5060323a05cf2de361ca5cd788882ab124e 9f9cdad793414edd07516ebe0fef99bea77a67d7033bcce9e6e2636fc52d206f
40072ee5313e41a68b132298796cbec4d044881a473056704dbaf45732b96709 e9b0d5f175dde593817759ef48c2ea4be074dd6fd7dde1e5ee0051f1cbbb36e7
449de67da5b95f36f74bf415852073e587a6f2f5acffecd8470687a065aa9a24 fd27f4eaa94fe2d4e43106f3751004bf816189bf06237c658a0c8e7aec6e54c8
67aa8dec46ea42423b4090c10503d733f4ff4c1eb43cb8e31f040c84cafba60c
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用bindmount进行初始加载,我可以找到该文件作为容器中的安装点,因此至少我可以获取相对于安装点的文件(但不是很可靠)。在 WSL2 主机上运行:
$ find /mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04 -name clippy.toml
/mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04/b7371a7ca29bc7acbea2f7cebdf0d5b452a4fadd8af16a733896e7dccbd49e3a/clippy.toml
/mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04/0157aea7f7f54b90e62c5810422a2535f5513005a8db7001cf10c7753d3dc6fb/clippy.toml
Run Code Online (Sandbox Code Playgroud)
然而,如果该文件存在超过 1 个容器或绑定安装,则这并不简单。此外,容器的哈希值都不与 Docker 检查或主机名匹配。现在,在容器上运行:
$ correct_id=b7371a7ca29bc7acbea2f7cebdf0d5b452a4fadd8af16a733896e7dccbd49e3a
$ echo $HOSTNAME
dadd6ab5f853
$ docker inspect $HOSTNAME| grep b737
# nothing
Run Code Online (Sandbox Code Playgroud)
所以似乎没有可靠的方法来查找该文件。此外,对于绑定安装之外的任何文件,似乎没有办法找到它们的路径。然而,至少,如果传递到容器中,正确的 WSL2 绑定安装位置确实可以工作:
$ docker run --rm -it --entrypoint bash \
-v /mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04/b7371a7ca29bc7acbea2f7cebdf0d5b452a4fadd8af16a733896e7dccbd49e3a/:"$PWD" \
-w "$PWD" gcr.io/cloud-builders/docker
$ ls
CHANGELOG.md Cargo.lock LICENSE-APACHE README.md ci crosstool-ng docker rustfmt.yml target
CODE_OF_CONDUCT.md Cargo.toml LICENSE-MIT assets clippy.toml deny.toml docs src xtask
Run Code Online (Sandbox Code Playgroud)
但是,我如何找到位于 的容器中的文件/hello/file(该文件是在 WSL2 中运行的容器内创建的)?
我还应该提到的是,Windows 版 Docker Desktop 正在共享到 WSL Ubuntu 发行版中。Docker 未安装在发行版内,并且在没有 iptables 的情况下使用。
中的 ID 的docker-desktop-bind-mounts计算方式如下 [1]:
realpath /tmp/ | tr -d '\n' | sha256sum
=> e9671acd244849c57167c658fa2f969752048f7ab184a3dcf5c46cb4d56ae124
Run Code Online (Sandbox Code Playgroud)
因此,如果您从Ubuntu-22.04WSL2 发行版内部启动 docker,则内部的哈希值docker-desktop-bind-mounts/Ubuntu-22.04/会映射到/tmpWSL2 发行版内部。
[1] https://github.com/docker/for-win/issues/9823#issuecomment-866776203
| 归档时间: |
|
| 查看次数: |
582 次 |
| 最近记录: |