Докер: что такое использование локальных томов и некоторые наблюдения за томами - PullRequest
0 голосов
/ 15 марта 2019

У меня есть следующий файл 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, не будут доступны в контейнере.

1 Ответ

0 голосов
/ 15 марта 2019

Если вы работаете с базой данных в Docker, вы можете подключить локальный каталог непосредственно в свой контейнер, используя опцию -v в команде run.

docker run -d \
-v <local path>:<container path>:z \
..
..
<your image>

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

Также прочитайте это https://docs.docker.com/storage/volumes/

...