Как смонтировать каталог Docker в каталог хоста с помощью docker-compose - PullRequest
0 голосов
/ 03 сентября 2018

Представьте, что у меня есть контейнер Docker, содержащий некоторые статические данные.

Теперь для целей разработки я хочу, чтобы содержимое каталога контейнера /resources было подключено к моему локальному рабочему каталогу ..

докер-compose.yml:

version: '3.2'

services:
  resources:
    image: <private_registry>/resources:latest
    volumes:
    - ./resources:/resources

При запуске docker-compose up папка resources создается в моем рабочем каталоге, но в ней нет содержимого, тогда как в контейнере есть содержимое в /resources/

При использовании именованного тома и его проверке он работает, как и ожидалось.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Docker обеспечивает инициализацию источника тома для содержимого вашего изображения в определенном сценарии:

  • Это должен быть именованный том, а не хост-том (отображающий путь в контейнер)
  • Источник тома должен быть пустым, если в каталоге есть данные, они не будут изменены докером
  • Только при создании контейнера (во время работы контейнера он не будет повторно инициализировать папку)
  • Параметр отключения копии не установлен (это параметр «nocopy» в файле композиции).

В настоящее время вы застряли на первом требовании, но можно сопоставить любую папку с хоста в контейнер, используя именованный том, который выполняет подключение. Вот несколько примеров трех разных способов сделать это:

  # create the volume in advance
  $ docker volume create --driver local \
      --opt type=none \
      --opt device=/home/user/test \
      --opt o=bind \
      test_vol

  # create on the fly with --mount
  $ docker run -it --rm \
    --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
    foo

  # inside a docker-compose file
  ...
  volumes:
    bind-test:
      driver: local
      driver_opts:
        type: none
        o: bind
        device: /home/user/test
  ...

Ваш пример будет выглядеть примерно так:

version: '3.2'

services:
  resources:
    image: <private_registry>/resources:latest
    volumes:
    - resources:/resources
volumes:
  resources:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /full/path/to/resources

Обратите внимание, что этот каталог должен существовать на хосте заранее. Без него подключение не будет выполнено, и, в отличие от хост-подключения, докер не создаст его для вас.

0 голосов
/ 04 сентября 2018

Здесь есть пара вещей. Во-первых, когда вы монтируете каталог хоста, он «затеняет» любой существующий контент по заданному пути, фактически заменяя его содержимым монтирования. Итак, ваш каталог ресурсов на вашем хосте скрывает любой контент в вашем контейнере.

Нет простого решения вашей проблемы. Когда я хочу редактировать файлы в контейнере и на хосте, я сохраняю файлы на хосте и монтирую их в контейнере. Если мне нужна копия контейнера, я монтирую каталог хоста в другой каталог в контейнере и организую копирование файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...