docker постоянное хранилище через том - PullRequest
1 голос
/ 31 марта 2020

Все, что читают, говорят, что мы можем создать docker постоянное хранилище с помощью элемента управления VOLUME, например, здесь и здесь .

Однако, В моем Dockerfile есть следующее:

VOLUME      ["/home", "/root"]

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

Я вижу, что официальное использование не имеет других специальных элементов управления или обработок, однако оно может обеспечить постоянное хранение, даже если служебный контейнер apt-cacher-ng остановлен.

Как это возможно? Я проверил следующее, но до сих пор не понимаю:

В заключение, как объяснено здесь :

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

Как я могу сделать работу постоянного хранилища? Почему мои изменения стираются каждый раз, когда служебный контейнер apt-cacher-ng может сохранять свое постоянное хранилище, даже если он остановлен и перезапущен? Что такое "другие специальные средства управления или обработки" , которые я не смог увидеть здесь?

Объясните простым простым Dockerfile (не docker-compose.yml), пожалуйста.

1 Ответ

1 голос
/ 31 марта 2020

Проблема заключается в том, что инструкция VOLUME создает внешнее хранилище при использовании прогона docker без опции «mount» для указанной папки c. Другими словами, каждый раз, когда вы создаете контейнер для этого изображения, docker будет создавать новый том со случайной меткой, но поскольку вы не присваиваете этим томам имя, новые контейнеры не могут повторно использовать существующие сгенерированные тома.

напр.

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

Учитывая этот Dockerfile, если вы просто создадите и запустите этот docker образ с помощью следующих команд:

echo "There are currently $(docker volume ls | wc -l) volumes"

docker build -t my_volume_test:latest .
docker run --name another_test my_volume_test:latest

echo "There are currently $(docker volume ls | wc -l) volumes"

вы увидите, что количество томов на вашем компьютере увеличилось. Этот контейнер теперь использует том для хранения данных, но этот указанный том c не имеет имени или метки, поэтому он привязан только к этому указанному c контейнеру. Если вы удалите и заново создадите этот контейнер, docker создаст новый том со случайным именем, если вам не удастся смонтировать ранее созданный том.

Если вы хотите упростить его, я предлагаю сначала создайте том и смонтируйте его потом. например,

docker rm -f another_test
docker volume create my-vol

docker run \
    --name another_test \
    --mount source=my-vol,target=/myvol \
    my_volume_test:latest

# alternative
docker rm -f another_test
docker run \
    --name another_test \
    -v my-vol:/myvol \
    my_volume_test:latest

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

проверьте ссылку VOLUME и Используйте тома для получения дополнительной информации.

...