Обратите внимание, что это не дубликат Поиск томов данных в Docker Desktop (Windows), поскольку еще в 2017 году внутренняя работа Docker в Windows была совсем другой - например, Вывод docker volume inspect в настоящее время сильно отличается.

У меня проблемы с доступом к данным, подключенным к контейнерам в докере для 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"
}
]

-> Точка монтирования находится внутри Hyper V, используемого в Docker. Как получить доступ к этим данным? Есть ли простой способ сделать это?

Примечание. У меня нет C:\ProgramData\Docker\Volumes, как описано в здесь. Вместо этого с помощью Docker Desktop 2.0.0.3, Engine 18.03.3 был создан C:\ProgramData\DockerDesktop. Насколько я могу судить, это не содержит никаких томов.

Предпосылки: Мне нужны именованные монтирования с расположением по умолчанию внутри HyperV, так как монтирование вручную через docker run -v или указание местоположения устройства драйвера выглядит как не поддерживается mongodb (у меня точно такое же поведение, как описано там. Похоже, mongodb несовместим с Монтирует том с файловой системой NTFS.

1
Michel Müller 2 Апр 2019 в 15:22

1 ответ

Лучший ответ

метод с использованием встроенного docker cp

Используйте docker cp [containername]:[path] [host-path], например, копировать данные - поменять местами параметры для копирования данных - работает так же, как scp. Чтобы получить доступ оболочки к данным, вы можете просто присоединиться к работающему контейнеру.

Pro: в docker compose ничего не нужно

Против: нет интеграции (насколько я знаю) с графическим интерфейсом файлового проводника, таким как WinSCP. необходимо делать копию на основе терминала каждый раз, когда файл должен быть обновлен между хостом и контейнером.

метод с использованием докеризованного ssh-сервера

Pro: может интегрироваться с любым инструментом, который может общаться через ssh / sftp

Против: требуется дополнительная настройка

Следующий подход запускает ssh-сервер внутри службы, настраивая его с помощью docker-compse, чтобы он автоматически запускался и использовал шифрование с открытым ключом между хостом и контейнером для авторизации. Таким образом, данные могут быть загружены / загружены через scp или sftp.

Полный docker-compose.yml для приложения node.js (keystone) + mongodb приведен ниже вместе с некоторой документацией по использованию службы 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
2
Michel Müller 4 Май 2020 в 14:25