【问题标题】:Docker for Windows: Accessing named volume mountsDocker for Windows:访问命名卷挂载
【发布时间】:2019-08-23 18:35:42
【问题描述】:

注意,这不是Locating data volumes in Docker Desktop (Windows) 的重复,因为早在 2017 年,Windows 上 docker 的内部工作方式就完全不同了 - 例如现在 docker volume inspect 的输出已经完全不同了。

我无法通过命名卷装载访问装载到 docker for windows 中的容器的数据。

docker inspect [vol-id]

[
{
    "CreatedAt": "2019-04-02T11:58:14Z",
    "Driver": "local",
    "Labels": {
        "com.docker.compose.project": "foo",
        "com.docker.compose.version": "1.24.0",
        "com.docker.compose.volume": "mongodata-foo"
    },
    "Mountpoint": "/var/lib/docker/volumes/foo_mongodata-foo/_data",
    "Name": "foo_mongodata-payoff",
    "Options": null,
    "Scope": "local"
}
]

--> Mountpoint 位于 Docker 中使用的 HyperV VM 内部。如何访问该数据?有没有一种易于管理的方法?

注意:我没有 C:\ProgramData\Docker\Volumes 所描述的 here。相反,使用 Docker Desktop 2.0.0.3、引擎 18.03.3 创建的是 C:\ProgramData\DockerDesktop。据我所知,它不包含任何卷。

背景:需要在 HyperV 中使用默认位置命名挂载,因为通过 docker run -v 手动挂载它或指定驱动程序设备位置看起来是 unsupported by mongodb(我的行为与那里描述的完全相同。看起来 mongodb 与源自 NTFS 的卷挂载不兼容。

【问题讨论】:

  • 运气好吗?我碰巧坚持了同样的方式,定位卷似乎并不像使用 docker 工具箱那样简单。
  • 是的,你检查我下面的答案了吗?
  • 一切都被删除了:-),被忽略了。是否有任何直接访问卷的方法
  • 是的,docker cp,没有被删除。也许我应该更好地格式化东西
  • 好的,我试图让我的答案更清楚。现在怎么样?

标签: docker hyper-v docker-volume docker-for-windows docker-desktop


【解决方案1】:

使用内置 docker cp 的方法

例如使用docker cp [containername]:[path] [host-path]复制数据 - 反转参数以复制数据 - 它就像 scp 一样工作。要获得对数据的 shell 访问,您只需附加到正在运行的容器即可。

pro:在 docker compose 中不需要额外的东西

con:没有与 WinSCP 之类的文件浏览器 GUI 集成(据我所知)。每次在主机和容器之间更新文件时,都需要进行基于终端的复制。

使用 dockerized ssh 服务器的方法

pro:可以与任何可以通过 ssh/sftp 通信的工具集成

缺点:需要额外设置

以下方法在服务中启动 ssh 服务器,使用 docker-compse 进行设置,使其自动启动并在主机和容器之间使用公钥加密进行授权。这样就可以通过scp或者sftp上传/下载数据了。

下面是 node.js (keystone) + mongodb 应用程序的完整 docker-compose.yml,以及一些关于如何使用 ssh 服务的文档:

version: '3'
services:
  foo:
    build: .
    image: localhost.localdomain/${repository_name}:${tag}
    container_name: ${container_name}
    ports:
      - "3333:3333"
    links:
      - mongodb-foo
    depends_on:
      - mongodb-foo
      - sshd
    volumes:
      - "${host_log_directory}:/var/log/app"

  mongodb-foo:
    container_name: mongodb-${repository_name}
    image: "mongo:3.4-jessie"
    volumes:
      - mongodata-foo:/data/db
    expose:
      - '27017'

  #since mongo data on Windows only works within HyperV virtual disk (as of 2019-4-3), the following allows upload/download of mongo data
  #setup: you need to copy your ~/.ssh/id_rsa.pub into $DOCKER_DATA_DIR/.ssh/id_rsa.pub, then run this service again
  #download (all mongo data): scp -r -P 2222 user@localhost:/data/mongodb [target-dir within /c/]
  #upload (all mongo data): scp -r -P 2222 [source-dir within /c/] user@localhost:/data/mongodb
  sshd:
    image: maltyxx/sshd
    volumes:
        - mongodata-foo:/data/mongodb
        - $DOCKER_DATA_DIR/.ssh/id_rsa.pub:/home/user/.ssh/keys/id_rsa.pub:ro
    ports:
        - "2222:22"
    command: user::1001

#please note: using a named volume like this for mongo is necessary on Windows rather than mounting an NTFS directory.
#mongodb (and probably most other databases) are not compatible with windows native data directories due ot permissions issues.
#this means that there is no direct access to this data, it needs to be dumped elsewhere if you want to reimport something.
#it will however be persisted as long as you don't delete the HyperV virtual drive that docker host is using.
#on Linux and Docker for Mac it is not an issue, named volumes are directly accessible from host.
volumes:
  mongodata-foo:

注意:对于一个完整的示例,在任何 docker-compose 调用之前,需要运行以下脚本:

#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset

working_directory="$(pwd)"
host_repo_dir="${working_directory}"
repository_name="$(basename ${working_directory})"
branch_name="$(git rev-parse --abbrev-ref HEAD)"
container_name="${repository_name}-${branch_name}"
host_log_directory="${DOCKER_DATA_DIR}/log/${repository_name}"
tag="${branch_name}"

export host_repo_dir
export repository_name
export container_name
export tag
export host_log_directory

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多