Докер сочинять.Объем внутри другого тома в том же контейнере.Как это работает? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь создать относительно простую установку для разработки и тестирования пакетов npm.Проблема была в том, что после монтирования тома кода в контейнер он заменяет node_modules.

Я перепробовал много общих логических вещей, в основном направленных на то, чтобы переместить node_modules в другое место и затем ссылаться на него в файлах конфигурации.Это работает, но решение уродливо.Кроме того, не рекомендуется устанавливать веб-пакет глобально, но мое решение требует его.

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

Это моя версия того, как все работает.

  1. Docker изменяет порядок установки томов на основе путей к контейнерам

  2. Docker монтирует sub dirобъем вначале

  3. Docker монтирует родительский том dir, но из-за необъяснимого механизма он не перекрывает том sub dir ...

  4. ???

  5. ПРИБЫЛЬ.node_modules dir на месте, и веб-пакет работает отлично.

Итак, я действительно хочу понять, как на самом деле происходит вся эта черная магия.Потому что без этого знания я чувствую, что упускаю что-то важное.
Итак, ребята, как это работает?Заранее спасибо.

services:
  react-generic-form:
    image: react-generic-form:package
    container_name: react-generic-form-package
    build:
      dockerfile: dev.Dockerfile
      context: ./package
    volumes:
      - "./package:/package"
      - "/package/node_modules"

1 Ответ

0 голосов
/ 26 марта 2019

Демон Docker при создании контейнера сортирует все точки монтирования, чтобы избежать затенения.(В не-Windows это происходит в (*github.com/docker/docker/daemon.Daemon).setupMounts.) Итак, в вашем примере:

  1. Демон Docker видит, что и /package, и /package/node_modules содержат данныеон хранится вне файлового пространства контейнера.
  2. Сортирует их от самых коротких до самых длинных.
  3. Он монтирует /package в качестве привязки к указанному каталогу хоста.(Во-первых, потому что это более короткое имя пути.)
  4. Он монтирует /package/node_modules, скрывая эквивалентный каталог в предыдущем монтировании, вероятно, в виде привязки к каталогу с длинным именем шестнадцатеричного идентификатора где-то в /var/lib/docker/volumes.

Вы можете поэкспериментировать с этим с файлом docker-compose.yml, таким как

version: '3'
services:
  touch:
    image: busybox
    volumes:
      - ./b:/a/b
      - ./a:/a
    command: touch /a/b/c

Обратите внимание, что в любом порядке, в который вы положили volumes:, вы получите пустойкаталог ./a/b (который становится точкой монтирования внутри контейнера) плюс пустой файл ./b/c (результат команды touch).

Также обратите внимание на следующее утверждение: каталог node_modulesсодержит данные, которые должны сохраняться при вызове контейнера, и имеет жизненный цикл отдельно от контейнера или его базового образа.Изменение изображения и повторное выполнение docker-compose up не повлияет на содержимое этого тома.

...