2016-01-06 2 views
1

Это не должно быть сложно, но я не могу понять это. У меня есть контейнер и используется -v /tester в команде запуска docker. Затем я делаю docker exec ti containername /bin/bash. Затем я создаю файл с именем /tester/stayhere.txt с vi /tester/stayhere.txt. Затем я сохраняю файл и проверяю его. Затем я делаю фиксацию докеров и запускаю новое изображение, а файл stayhere.txt отсутствует. Что я делаю не так?Персистские файлы данных в контейнере докеров

ответ

1

Когда вы монтируете том внутри контейнера докера с -v, он не считается частью самого контейнера. Вот почему, когда вы совершаете изменения, это отсутствует.

Согласно Docker документаций:

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

И:

Объемы инициализируются при создании контейнера. Если базовое изображение контейнера содержит данные в указанной точке монтирования, то существующие данные копируются в новый том после инициализации тома.

Что это означает, объемы данных живут за пределами Союза Filesystem и если вы даже удалить этот объем контейнера данных по-прежнему сохраняется:

объемы данных предназначены для сохранения данных, независимо от контейнера жизненный цикл. Поэтому Docker никогда автоматически не удаляет тома при удалении контейнера, и он не «собирает мусор» тома, на которые контейнер больше не ссылается.

Таким образом, они не являются частью вашей команды фиксации докеров.

Для того, чтобы добиться желаемого результата, вам необходимо скопировать файл по тому же пути на вашем изображении, пока он не установлен в качестве объема докеров.Вы можете использовать Dockerfile или сразу запустить контейнер и изменить файловую систему, а затем зафиксировать.

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

0

Не могу сказать, без каких команд вы работаете. Я бы предположил, что вы действительно не начинаете «новый» образ каким-то образом. Я думаю, это было бы потому, что вы «начинаете» его с docker exec (который запускает вещи в запущенном контейнере), а не docker run.

В целом, хотя я бы предположил, что это плохая практика изменения и фиксации. То, что вы действительно должны делать, - это что-то, что является частью сборки вашей вещи, которую вы должны делать во время сборки (с Dockerfile).

Все, что является постоянным состоянием, вы должны монтировать в свой контейнер - либо с помощью тома, либо в контейнере для хранения.

Это не очень легко создать одну из них:

docker create -v /path/to/data --name my_storage_container base-image-name /bin/true 

А затем начать свой контейнер с чистой сборки картинки:

docker run -it --volumes-from my_storage_container image /bin/bash 

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

+0

Thanks Sobrique Я не думаю, что у меня есть то, что вы говорите, но я упростил проблему, чтобы попытаться получить ответ. В основном, моя ситуация заключается в том, что у меня есть докер, работающий в AWS и докере, работающем в облаке IBM. Контейнер, который я запускал в AWS, я хотел бы экспортировать и запускать в облаке IBM, но независимо от того, что я делаю, я не могу заставить файлы оставаться. Как вы предлагаете мне переместить контейнер и файлы в облако IBM? –

+0

Я попытался сохранить docker, экспортировать, зафиксировать, но я думаю, что вы говорите мне, что, возможно, я должен использовать docker cp, чтобы вытащить файлы из контейнера и установить их в новый контейнер ... это кажется странным, потому что то я должен переместить изображение докеры и набор данных. Это нарушает мое понимание контейнеров ... почему бы не поместить все это в контейнер и не переместить его? –

+0

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

Смежные вопросы