Команда VOLUME Dockerfile, данные теряются при монтировании как bindmount - PullRequest
0 голосов
/ 02 мая 2020

Я создал Dockerfile и запустил контейнер с bindMount, содержимое потеряно (без содержимого)

FROM alpine:3.8
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

docker run -it --name volDemo2 -v $(pwd)/myvol:/myvol voldemo sh

Я ожидаю, что «myvol» в «pwd» должно содержать «приветствие», которое не тот случай

  root@default:/home/docker# docker run -it --name volDemo2 -v $(pwd)/myvol:/myvol voldemo sh           
/ # cd myvol/                                                                                         
/myvol # ls                                                                                           
/myvol # 

Однако то же самое работает нормально, если он монтируется следующим образом

docker@default:~$ docker run -it --name volDemo1 -v myvol:/myvol voldemo sh  
/ # cd myvol/                                                                
/myvol # ls                                                                  
1.txt     greeting                                                           
/myvol # exit 

Если это ожидаемое поведение, инструкция VOLUME будет работать только с «громкостью» и не "bindmounts"

1 Ответ

0 голосов
/ 03 мая 2020

Вот как работают крепления. Они монтируют одну папку в другой путь в файловой системе. Весь доступ к целевому пути отображается непосредственно обратно в исходный каталог.

То, что docker предоставляет для именованного тома (ваш второй пример), является этапом инициализации, когда этот именованный том пуст при создании контейнера. Они будут копировать все файлы, каталоги и метаданные, такие как владелец файла и разрешения, из файловой системы образа в указанный том перед запуском контейнера. Это происходит только с именованными томами, а не с монтируемыми хостами или томами tmpfs. И это происходит только тогда, когда именованный том пуст, поэтому он не будет обновляться при изменении образа.


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

  # 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
  ...

Если ваша цель - упростить работу других пользователей образа и потенциально обновить том новыми версиями образа, то вы Я хочу сделать это как часть вашего сценария точки входа. Я делаю это в моих скриптах кеширования томов , включенных в базовый образ. Вы копируете каталог тома в безопасное место внутри образа, а затем при запуске контейнера сценарий точки входа копирует файлы в том.

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