Яка мета гучності в Dockerfile


106

Я намагаюся заглибитися в розуміння обсягу Докера, і мені важко розібратися в відмінностях / випадку використання:

  • docker volume createкоманда
  • The docker run -v /path:/host_path
  • VOLUMEЗапис в Dockerfileфайл

Я особливо не розумію, що станеться, якщо поєднати VOLUMEзапис із -vпрапором.


Відповіді:


70

Том - це постійні дані, що зберігаються в /var/lib/docker/volumes/...

  • Ви можете або оголосити його в Dockerfile, тобто кожен раз, коли контейнер запускається із зображення, створюється том ( порожній ), навіть якщо у вас немає жодної -vопції.

  • Ви можете оголосити це під час виконання docker run -v [host-dir:]container-dir.
    поєднання двох ( VOLUME+ docker run -v) означає, що ви можете змонтувати вміст хост-папки у свій об'єм, на який зберігається контейнер/var/lib/docker/volumes/...

  • docker volume create створює об'єм без необхідності визначати Dockerfile і створювати зображення та запускати контейнер. Він використовується для швидкого дозволу інших контейнерів монтувати згаданий об'єм.

Якщо ви зберігали деякий вміст у томі, але з тих пір видалили контейнер (який за замовчуванням не видалив пов'язаний з ним обсяг, якщо ви не використовуєте docker rm -v), ви можете знову приєднати зазначений том до нового контейнера (декларуючи однаковий обсяг).

Див. " Докер - Як отримати доступ до тома, не приєднаного до контейнера? ".
Створюючи об'єм докерського об'єму, це легко приєднати названий том до контейнера.

docker volume create --name aname
docker run -v aname:/apath --name acontainer
...
# modify data in /apath
...
docker rm acontainer

# let's mount aname volume again
docker run -v aname:/apath --name acontainer
ls /apath
# you find your data back!

2
Скажімо, ви використовуєте Dockerfileс VOLUMEі -v /path:/host_path/прапор. Зміст VOLUMEзаповіту буде перекрито змістом /host_path/?
радіум226

Завдяки вам @VonC, я думаю, що я це зрозумів :) І якщо ви зробите docker volume create --name my_volumeнаступний a docker run --volume-from my_volume, як ви знаєте, де буде точка монтажу ?
радіум226

@ radium226 немає точки монтажу (мається на увазі нічого, встановлене від хоста, поруч із рідним порожнім / var / lib / docker / volume). Шлях обсягу в my_volume метаданих: stackoverflow.com/a/31997267/6309
VonC

Я розумію, що немає точки кріплення на стороні хоста. Але всередині запущеного контейнера, з docker run ...яким запускається , як я можу записати у файл, збережений на my_volumeтомі? Я не знаю ... шлях? обсягу всередині мого запущеного контейнера, оскільки я нічого не визначав? Я сподіваюся, що я досить зрозумілий, тому що я точно не впевнений у своїй голосності: - /
radium226

1
@ radium226 docker volume create --name anameстворює іменований том: Ви призначаєте шлях контейнера під час виконання docker run -v aname:/apath:: цей контейнер тепер додає до нього об'єм, встановлений у папку / apath. Я переписав відповідь, щоб зробити це зрозумілим.
VonC

11

VOLUMEінструкція стає цікавою, коли ви поєднуєте її з volumes-fromпараметром виконання.

З огляду на такий Dockerfile:

FROM busybox
VOLUME /myvolume

Створіть зображення за допомогою:

docker build -t my-bb .

І розкрутити контейнер з:

docker run --rm -it --name my-first-bb my-bb

Перше, що потрібно помітити - у вас буде папка із цим зображенням myvolume. Але це не особливо цікаво, оскільки коли ми вийдемо з контейнера, обсяг також буде видалений.

Створіть порожній файл у цій папці, тому запустіть у контейнері таке:

cd myvolume
touch hello.txt

Тепер оберніть новий контейнер, але поділіться таким же обсягом з my-first-bb:

docker run --rm -it --volumes-from my-first-bb --name my-second-bb my-bb

Ви побачите, що my-second-bbмістить файл hello.txtу myvolumeпапці.

Щойно ви вийдете з обох контейнерів, ваш об'єм також буде видалений.


Томи будуть видалені, оскільки вони є анонімними томами І ви запустили контейнери з --rmопцією. Я думаю, це може спрацювати, згадуючи про це. Якщо ви не запустили контейнер --rm, ви можете видалити контейнер та його анонімні томи за допомогою docker rm -v my-container.
AymDev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.