Как сделать Тома постоянными с помощью 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."