Как сделать Тома постоянными с помощью Docker Compose v2
Я понимаю, что у других людей были подобные вопросы, но это использует формат файла V2 compose, и я ничего не нашел для этого.
Я хочу сделать очень простое тестовое приложение, чтобы играть с MemSQL, но я не могу получить тома, чтобы не удаляться после docker-compose down
. Если я правильно понял документы Docker, Тома не должны удаляться без явного указания этого. Кажется, все работает с docker-compose up
но после снижения, а затем снова вверх все данные удаляются из база данных.
как рекомендуется в качестве хорошей практики, я использую отдельный сервис memsqldata в качестве отдельного слоя данных.
вот мой докер-сочинять.в формате YML:
version: '2'
services:
app:
build: .
links:
- memsql
memsql:
image: memsql/quickstart
volumes_from:
- memsqldata
ports:
- "3306:3306"
- "9000:9000"
memsqldata:
image: memsql/quickstart
command: /bin/true
volumes:
- memsqldatavolume:/data
volumes:
memsqldatavolume:
driver: local
5 ответов
я понимаю, что это старый и решенный поток, где OP указывал на каталог в контейнере, а не на том, который они установили, но хотел очистить некоторую дезинформацию, которую я вижу.
docker-compose down
не удаляет Тома, вам нужно запустить docker-compose down -v
если вы также хотите удалить томах. Вот текст справки прямо из docker-compose (обратите внимание на список "по умолчанию"):
$ docker-compose down --help
Stops containers and removes containers, networks, volumes, and images
created by `up`.
By default, the only things removed are:
- Containers for services defined in the Compose file
- Networks defined in the `networks` section of the Compose file
- The default network, if one is used
Networks and volumes defined as `external` are never removed.
Usage: down [options]
Options:
...
-v, --volumes Remove named volumes declared in the `volumes` section
of the Compose file and anonymous volumes
attached to containers.
...
$ docker-compose --version
docker-compose version 1.12.0, build b31ff33
вот образец yml с именованным Томом для тестирования и манекеном команда:
$ cat docker-compose.vol-named.yml
version: '2'
volumes:
data:
services:
test:
image: busybox
command: tail -f /dev/null
volumes:
- data:/data
$ docker-compose -f docker-compose.vol-named.yml up -d
Creating volume "test_data" with default driver
Creating test_test_1
после запуска контейнера том инициализируется пустым, так как изображение пусто в этом месте. Я создал быстрый мир hello в этом месте:
$ docker exec -it test_test_1 /bin/sh
/ # ls -al /data
total 8
drwxr-xr-x 2 root root 4096 May 23 01:24 .
drwxr-xr-x 1 root root 4096 May 23 01:24 ..
/ # echo "hello volume" >/data/hello.txt
/ # ls -al /data
total 12
drwxr-xr-x 2 root root 4096 May 23 01:24 .
drwxr-xr-x 1 root root 4096 May 23 01:24 ..
-rw-r--r-- 1 root root 13 May 23 01:24 hello.txt
/ # cat /data/hello.txt
hello volume
/ # exit
том виден вне Докера и все еще там после docker-compose down
:
$ docker volume ls | grep test_
local test_data
$ docker-compose -f docker-compose.vol-named.yml down
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default
$ docker volume ls | grep test_
local test_data
воссоздание контейнера использует старый том с файлом, все еще видимым внутри:
$ docker-compose -f docker-compose.vol-named.yml up -d
Creating network "test_default" with the default driver
Creating test_test_1
$ docker exec -it test_test_1 /bin/sh
/ # cat /data/hello.txt
hello volume
/ # exit
и docker-compose down -v
наконец-то удаляет контейнер и громкость:
$ docker-compose -f docker-compose.vol-named.yml down -v
Stopping test_test_1 ... done
Removing test_test_1 ... done
Removing network test_default
Removing volume test_data
$ docker volume ls | grep test_
$
если вы обнаружите, что ваши данные сохраняются только при использовании stop/start, а не down / up, то ваши данные хранятся в контейнере (или, возможно, в анонимном томе), а не в именованном Томе, и контейнер не является постоянным. Убедитесь, что расположение ваших данных внутри контейнера правильно, чтобы избежать этого.
для отладки, где данные хранятся в контейнере, я бы посоветовал использовать docker diff
в контейнере. Что покажет все файлы, созданные, измененные или удаленные внутри контейнера, которые будут потеряны при удалении контейнера. Например:
$ docker run --name test-diff busybox \
/bin/sh -c "echo hello docker >/etc/hello.conf"
$ docker diff test-diff
C /etc
A /etc/hello.conf
Это было прослежено до плохой документации из MemSQL. Путь к данным MemSQL в memsql/quickstart
контейнер /memsql
, а не /var/lib/memsql
как в Автономной установке (и в документах MemSQL), и определенно не /data
как кто-то сказал мне.
вы используете docker-compose down
и если вы посмотрите на документы здесь
остановите контейнеры и удалите контейнеры, сети, Тома и изображения создано
up
. По умолчанию удаляются только контейнеры и сети.
вы правы, он не должен удалить тома (по умолчанию). Это может быть ошибка или вы изменили настройки по умолчанию. Но я думаю, что правильная команда для вас docker-compose stop
. Я попробую сделать некоторые тесты с более простые случаи для .
не уверен, если это помогает или нет. Когда вы используете docker-compose up -d
контейнер загружается и создаются изображения. Чтобы остановить изображения docker, используйте docker-compose down
, и изображения останутся и могут быть перезапущены с помощью docker-compose start
я использовал команды up/down и продолжал терять свои данные, пока не попробовал stop/start, и теперь данные сохраняются.
самое простое решение-использовать docker-compose stop
вместо docker-compose down
. А потом ... --2--> перезагрузить.
по словам docs, down
"останавливает контейнеры и удаляет контейнеры, сети, Тома и изображения, созданные up."