Монтаж в docker соответствует стандартному поведению монтажа на Linux. Linux mount
команда документы говорят
The previous contents (if any) and owner and mode of dir become invisible, and as long as this filesystem remains mounted
То же самое происходит и в Docker. Если вы смонтируете локальный каталог или существующий с именем docker том, содержимое файловой системы в контейнере на месте монтирования будет затенено (или мы можем назвать его «переопределенным»).
Упрощенный пример того, что происходит
Имея dockerfile
FROM alpine:3.9.6
WORKDIR /home/root/greetings
RUN echo "hello world" > /home/root/greetings/english.txt
CMD sleep 60000
И соберите его docker build -t greetings:1.0 .
Теперь создайте следующее docker-compose.yml
:
version: '3.7'
services:
greetings:
container_name: greetings
image: greetings:1.0
volumes:
- ./empty:/home/root/greetings
и создайте пустой каталог empty
рядом с ним.
Запустите его docker-compose up -d
. Пока контейнер работает, давайте погрузимся в контейнер и посмотрим, как выглядит внутренняя структура файла. docker exec -ti greetings sh
. Теперь, когда мы внутри, если вы запустите ls /home/root/greetings
, вы увидите, что каталог пуст - хотя в Dockerfile мы запекли файл /home/root/greetings/english.txt
в файловую систему образа.
Именованные docker контейнеры вести себя более желательно, если именованный контейнер docker является новым и не содержит никаких данных. Если вы монтируете такой контейнер в том месте, где уже есть некоторые данные, указанный том скопирует на него эти данные.
Вы можете попробовать это, настроив docker-compose.yml
на это
version: '3.7'
services:
greetings:
container_name: greetings
image: greetings:1.0
volumes:
- greetingsvol:/home/root/greetings
volumes:
greetingsvol:
driver: local
и если вы повторите процедуру и сами запустите c в контейнер, вы увидите, что файл /home/root/greetings/english.txt
все еще там.
Это потому, что когда вы cd
сами в /home/root/greetings
, вы смотрите не на фактическую файловую систему контейнера, а на смонтированное устройство - имя docker том - которое было инициализировано копией оригинальных файлов контейнера в данном месте. (Предполагая, что docker том greetingsvol
ранее не существовал.)
Решение вашей проблемы
Вы монтируете каталог /var/kubeshare
на своем хосте в контейнер /var/lib/indy/sandbox
. Давайте посмотрим, что контейнер хранит в этом месте при запуске (indypool
- это то, как я назвал встроенный образ песочницы indy на моем локальном хосте)
docker run --rm indypool ls /var/lib/indy/sandbox
domain_transactions_genesis
keys
pool_transactions_genesis
Так что, если вы смонтируете локальный каталог в /var/lib/indy/sandbox
, он будет скрыть эти файлы, и пул не запустится (и, следовательно, не будет создавать файлы, такие как node1_additional_info.json
et c).
Так что я думаю, что у вас есть 2 варианта:
- Если у вас нет веских причин не использовать именованные docker тома.
- Скопируйте исходные данные изображения из контейнера
/var/lib/indy/sandbox
в ваш /var/kubeshare
. Тогда вы сохраните все остальное, как было. Таким образом, каталог будет затенен новой файловой системой, содержащей точно такие же данные, которые контейнер ожидает там найти.