Что происходит, когда том связывает существующий заполненный хост и каталог контейнера

Я искал документы, но ничего не вышло, так что пришло время проверить это. Но для быстрой справки в будущем...

Папка хоста заполнена содержимым папки контейнера?

Это наоборот?

Содержимое обеих папок объединено? (В таком случае: Что происходит, когда файл с одинаковым именем находится в обеих папках?)

Или выдает ошибку? Возникает ли ошибка при запуске или при попытке создать образ с VOLUME, указывающим на существующую заполненную папку в контейнере?

Кроме того, еще одна вещь, которой нет в документах: нужно ли определять путь к контейнеру как VOLUME в файле Docker, чтобы использовать -v против него при запуске контейнера, или я могу создавать тома на лету?


person NotGaeL    schedule 22.09.2016    source источник


Ответы (2)


Когда вы запускаете контейнер и монтируете том с хоста, все, что вы видите в контейнере, это то, что находится на хосте — монтирование тома указывает на каталог хоста, поэтому, если в образе что-то было в каталоге, это игнорируется.

С изображением из этого Dockerfile:

FROM ubuntu
WORKDIR /vol
RUN touch /vol/from-container
VOLUME /vol

Когда вы запускаете его без монтирования хоста, содержимое образа копируется в том:

> docker run vol-test ls /vol
from-container 

Но смонтируйте том с хоста, и вы увидите только содержимое хоста:

> ls $(pwd)/host
from-host
> docker run -v $(pwd)/host:/vol vol-test ls /vol
from-host

И нет, вам не нужна инструкция VOLUME. Поведение такое же без него.

person Elton Stoneman    schedule 22.09.2016

Всякий раз, когда контейнер Docker создается с томом, установленным на хосте, например:

docker run -v /path/on/host:/data container-image

Любое содержимое, которое уже находится в /data из-за процесса сборки образа, всегда полностью отбрасывается, и все, что в настоящее время находится в /path/on/host, используется вместо него. (Если /path/on/host не существует, он создается как пустой каталог, хотя я думаю, что некоторые аспекты этого поведения в настоящее время могут быть объявлены устаревшими.)

Предварительное определение тома в Dockerfile с помощью VOLUME не требуется; все, что делает VOLUME, это приводит к тому, что любые контейнеры, запускаемые из образа, имеют неявный аргумент -v /volume/path (обратите внимание на отсутствие пути монтирования хоста), добавленный к их команде docker run, который игнорируется, если используется явный -v /host/path:/volume/path.

person jwodder    schedule 22.09.2016