2016-02-25 7 views
7

Я понимаю, что у других людей были схожие вопросы, но это использует формат файла v2, и я ничего не нашел для этого.Как сделать объемы постоянными с Docker Compose v2

Я хочу сделать очень простое тестовое приложение, чтобы поиграть с MemSQL, но я не могу получить тома, чтобы не удаляться после docker-compose down. Если я правильно понял Docker Docs, томы не должны быть удалены без явного указания. Кажется, что все работает с docker-compose up, но после спуска и затем снова все данные удаляются из базы данных.

Как рекомендуется в качестве хорошей практики, я использую отдельную службу memsqldata как отдельный слой данных.

Вот мой докер-compose.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 
+1

Я бы попробовал без контейнера memsqldata. Поскольку вы используете именованный том, вам не нужен контейнер объема данных. Я попробовал 'down', и он не удаляет тома по умолчанию. – dnephin

+0

Возможно ли, что данные mysql не находятся в томе? Я не думаю, что он обычно использует '/ data'. – dnephin

ответ

4

Это было прослежено до плохой документации из MemSQL. Путь данных MemSQL в контейнере memsql/quickstart равен /memsql, а не /var/lib/memsql, как в автономной установке (и в документах MemSQL), и определенно не /data, как мне сказал кто-то.

1

Вы используете docker-compose down и если вы посмотрите на документы here

Остановить контейнеры и удалять контейнеры, сети, объемы и изображения созданный up. По умолчанию удаляются только контейнеры и сети.

Вы правы, он не должен удалять тома (по умолчанию). Это может быть ошибка, или вы, возможно, изменили конфигурацию по умолчанию. Но я думаю, что правильная команда для вас - docker-compose stop. Я попытаюсь провести несколько тестов с более удобными случаями для команды down.

+0

Я использую все в конфигурации по умолчанию. Я не эксперт Docker, поэтому я надеюсь, что есть разумные дефолты, выбранные;) Installed Toolbox вчера, поэтому все должно быть в самых последних версиях: docker-compose version 1.6.0, build d99cad6, версия docker-py: 1.7.0. – jimmy

+0

Вы уже пытались запустили и запустили свой «memsqldata» самостоятельно, предоставили некоторые файлы в своем томе, затем остановите его/удалите контейнер и посмотрите, есть ли еще файлы? –

+0

Да. Я тестировал ту же структуру memsql в течение нескольких дней. Я только что проверил, что он работает, если я сделаю остановку докеров. Это «вниз», похоже, действует не так, как предполагается. – jimmy

2

Не уверен, что это помогает или нет. Когда вы используете docker-compose up -d, контейнер загружается и создаются изображения. Чтобы остановить изображения докеров, используйте docker-compose down, и изображения останутся и могут быть перезапущены с помощью docker-compose start

Я использовал команды вверх/вниз и продолжал терять свои данные, пока не попытаюсь остановить/начать, и теперь данные сохраняются.

+0

После нескольких часов поиска это решило мою проблему! – mattsch

+0

Это неправильно. 'docker-compose down' удаляет тома. Я думаю, это то, что хотел сказать Бобби. –

+2

Stop/Start будет хранить одни и те же контейнеры, если вы потеряете данные с нисходящего/вверх, тогда вы не храните свои данные в томе, а ваши данные находятся в самом контейнере, который не следует считать постоянным. 'docker-compose down' не удаляет тома, если вы также не включили опцию' -v'. – BMitch

1

Наиболее простым решением является использование docker-compose stop вместо docker-compose down. А затем docker-compose start для перезапуска.

Согласно docs, down «останавливает контейнеры и удаляет контейнеры, сети, объемы и изображения, созданные вверху».

+1

'docker-compose down' не удаляет тома, если вы не передадите опцию' -v'. – BMitch

+0

Это не то, что я вижу, с этим файлом [docker-compose.yml] (https://github.com/jstray/cjworkbench-docker/blob/master/docker-compose.yml). Down определенно удаляет том даже без '-v'. Если я что-то делаю неправильно, я бы с удовольствием узнал! Я живу в страхе, что я случайно потеряю свою базу данных. –

+0

Это, вероятно, стоит задать как отдельный вопрос со всеми деталями, а не пытаться отлаживать комментарии. – BMitch

8

Я понимаю, что это старый и разрешенный поток, где ОП указывал на каталог в контейнере, а не на том томе, который они установили, но хотел прояснить некоторые из дезинформации, которые я вижу.

docker-compose down не удаляет тома, вам нужно запустить docker-compose down -v, если вы также хотите удалить тома.Вот текст справки прямо из Докер-композе (обратите внимание на «по умолчанию» список):

$ 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 

После запуска в контейнере объем инициализируется пустым, так как в этом месте изображение пуст. Я создал быстрый мир привета в этом месте:

$ 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_ 

$ 

Если вы обнаружили, что ваши данные только время сохраняются, если вы используете стоп/старт, а не вниз/вверх, то ваши данные хранятся в контейнере, а не объем, а емкость не является постоянным , Убедитесь, что место для ваших данных внутри контейнера правильно, чтобы этого избежать.

+0

Хорошее разъяснение.+1 – VonC

+0

Что это значит, что данные будут «в контейнере», а не в томе? Я предполагаю, что все, что хранится в каталоге, который отображается на томе, будет в томе? –

+0

Да, но, как показал OP, если вы не сопоставляете том с правильным местоположением, ваши данные не находятся в томе, а скорее в слое RW контейнера. Когда вы удаляете свой контейнер, все изменения, внесенные в этот контейнер (в основном это слой файловой системы RW), которые не были сохранены в томе, теряются. – BMitch