У меня есть следующий файл Docker
RUN touch /root/testing
VOLUME ["/root"]
после того, как я собрал и инспектировал, и в конфигурации я вижу
"Volumes": {
"/root": {}
},
после запуска / bin / bash и проверки
"Mounts": [
{
"Type": "volume",
"Name": "fc1dc25de37d6d7593a21443cd2bef74a0a6a4e3276b8353199054404665c398",
"Source": "/var/lib/docker/volumes/fc1dc25de37d6d7593a21443cd2bef74a0a6a4e3276b8353199054404665c398/_data",
"Destination": "/root",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
Когда я запускаю контейнер, он создает локальный том и монтирует его на /root
. Он также копирует содержимое /root
в локальное монтирование
если я сделаю это на хосте, мы увидим testing
файл в нем
ls /var/lib/docker/volumes/fc1dc25de37d6d7593a21443cd2bef74a0a6a4e3276b8353199054404665c398/_data
testing
Но локальный том будет уничтожен сразу после того, как контейнер будет убит.
Так, какова цель местного объема. Потому что иногда я, если по ошибке уничтожаю контейнер, и все же хочу, чтобы мой контейнер создавал некоторые данные на локальном томе, тогда это невозможно, поскольку локальный том также удаляется.
Я хотел попробовать именованные тома.
Я создал
docker volume create test
тогда я мой файл докера:
RUN touch /root/testing
VOLUME [{"Name":"test","Destination":"/root","external":"true"}]
OR
VOLUME [ "Name:{"Destination":"/root","external":"true"}"]
Когда я пытаюсь построить, я получаю:
Error response from daemon: when using JSON array syntax, arrays must be comprised of strings only
Тогда единственная оставленная опция - это монтировать том из командной строки, а не Dockerfile
docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
[root@7c7001221c14 /]# ls /root
testing
Теперь я проверяю содержимое тестового тома:
$ docker run --rm -it --mount source=test,destination=/tmp/myvolume archlinux/base ls /tmp/myvolume
testing
Здесь, поскольку тестовый том полностью пуст, поэтому он копировал содержимое / root (т.е. тестирование файла) из образа, когда я делаю docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
в тест тома
Но если том test
не пустой до того, как я docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
: т.е.
sudo cd /var/lib/docker/volumes/test/_data
rm -rf *
mkdir hellophp
, а затем сделать
docker run --rm -it --mount source=test,destination=/root archlinux/test /bin/bash
[root @ 7c7001221c14 /] # ls / root
hellophp
Итак, мои наблюдения:
---- VOLUME ["/path/in/container/"]
создаст только local volumes
мы не можем использовать named volumes
здесь
---- Если я хочу использовать named volumes
, тогда
а) создать именованный том
docker volume create test
б) смонтировать указанный том в путь к контейнеру
--mount source=test,destination=/path/in/container
------ *** Самое важное наблюдение
Если именованный том пуст, (в нем нет файлов), затем после запуска
docker run --rm -it --mount source=test,destination=/path/in/container IMAGENAME CMD
скопирует содержимое тома /path/in/container
на test
, а затем смонтирует том test
на /path/in/container
ELSE (т. Е. В именованном томе есть какой-то файл) затем после запуска
docker run --rm -it --mount source = test, destination = / path / in / container IMAGENAME CMD
Он не изменит том test
путем копирования файлов с тома /path/in/container
на test
перед подключением.
Он будет монтировать test
том в /path/in/container
. Поэтому любые файлы, существующие в /path/in/container
, не будут доступны в контейнере.