Comments 8
Пользуясь случаем, спрошу. Как правильно монтировать persistent разделы в docker-compose?
Сейчас использую такую копипасту, но выглядит оно не очень и не работает под виндой:
Сейчас использую такую копипасту, но выглядит оно не очень и не работает под виндой:
volumes: some-volume: driver_opts: type: none device: /path/to/volume o: bind
Коллега ответил, но похоже, что ответ где-то потерялся, так что я его продублирую:
Если ты хочешь примонтировать заданную директорию на хосте, то самый простой способ это указать путь до этой директории в docker-compose файле в определении сервиса:
Например:
Если хочешь просто иметь персистетное хранилище для твоего контейнера можно также использовать именованный вольюм. Для этого в определении сервиса указываешь имя вольюма вместо директории на хосте. Например:
Плюс этот именнованный вольюм еще нужно определить в секции volumes в том же компоуз файле. Следуя примеру, мы можем определить именнованный вольюм следующим образом (в секции mydata ничего не указываем, а берем опции по умолчанию):
Тогда твой вольюм можно будет найти на хосте по пути /var/lib/docker/volumes/.
Если ты хочешь примонтировать заданную директорию на хосте, то самый простой способ это указать путь до этой директории в docker-compose файле в определении сервиса:
volumes:
— /host/path:/container/path
Например:
services:
db:
image: mysql:5.7
volumes:
- ./mysql_data:/var/lib/mysql
Если хочешь просто иметь персистетное хранилище для твоего контейнера можно также использовать именованный вольюм. Для этого в определении сервиса указываешь имя вольюма вместо директории на хосте. Например:
services:
db:
image: mysql:5.7
volumes:
- mydata:/var/lib/mysql
Плюс этот именнованный вольюм еще нужно определить в секции volumes в том же компоуз файле. Следуя примеру, мы можем определить именнованный вольюм следующим образом (в секции mydata ничего не указываем, а берем опции по умолчанию):
volumes:
mydata:
Тогда твой вольюм можно будет найти на хосте по пути /var/lib/docker/volumes/.
Спасибо за такой развернутый ответ!
Хотел, было, написать в личку сначала, но потом решил — тут поспамлю. Вроде как в топик.
Инлайново всё выглядит действительно действительно классно!
А как быть, если вольюмы именованые, в отдельной секции, как в последнем примере, и хочется примонтировать определенную директорию на хосте?
Могу объяснить зачем.
С дефолтным путем
А именованные вольюмы в отдельной секции мне нравятся, хотя бы, из соображений читаемости компоуз-файла.
Хотел, было, написать в личку сначала, но потом решил — тут поспамлю. Вроде как в топик.
Инлайново всё выглядит действительно действительно классно!
— /host/path:/container/path
А как быть, если вольюмы именованые, в отдельной секции, как в последнем примере, и хочется примонтировать определенную директорию на хосте?
volumes:
mydata:
- /host/path/
Могу объяснить зачем.
С дефолтным путем
/var/lib/docker/volumes/
есть проблема под виндой: его, без танцев с бубном, не видно. По крайней мере, в virtualbox based версии (docker toolbox). Не знаю, как там в hyper-v based (docker for windows), она не работает вместе с установленным oracle virtualbox на одной системе (смайл).А именованные вольюмы в отдельной секции мне нравятся, хотя бы, из соображений читаемости компоуз-файла.
На Windows и OSX содержимое вольюмов не видно на твоей рабочей машине по понятным причинам, т.к. для работы контейнеров используется дополнительный слой виртуализации.
Именованными вольюмами управляет сам докер, поэтому ты не можешь использовать произвольную папку на твоей рабочей машине в качестве именованного вольюма. Если тебя интересует конкретная папка, то используй bind mount, указывая путь для монтирования нужной директории.
Именованными вольюмами управляет сам докер, поэтому ты не можешь использовать произвольную папку на твоей рабочей машине в качестве именованного вольюма. Если тебя интересует конкретная папка, то используй bind mount, указывая путь для монтирования нужной директории.
На Windows и OSX содержимое вольюмов не видно на твоей рабочей машине по понятным причинам, т.к. для работы контейнеров используется дополнительный слой виртуализации.Кстати, я бы не сказал, что причины очень понятны. Ведь папка /user из винды (в виртуалку с докером) маунтится стандартными средствами virtualbox. И почему бы сразу не пробросить обратно таким же образом
/var/lib/docker/
в винду — мне не понятно. Я пробовал сделать это сам, но, кроме добавления шары в vitualbox, нужно что-то ещё шаманить внутри linux-образа. А там, во-первых, весьма, такой, обрезанный линукс — busybox, я вообще ничего там ни понимаю. Во-вторых, я посчитал, что править «официальную» виртуалку было бы просто неправильно.поэтому ты не можешь использовать произвольную папку на твоей рабочей машине в качестве именованного вольюмаТехнически могу. Но выглядит ужасно.
volumes:
volume-name:
driver_opts:
type: none
device: /host/path
o: bind
Любопытно…
А можно пояснить вообще какую цель Вы преследуете с подобной задачей? Как-то не совсем оно понятно :)
А можно пояснить вообще какую цель Вы преследуете с подобной задачей? Как-то не совсем оно понятно :)
Поддержу тред.
Хост — OS X. Если использовать неименновые волумы то внутрь они у меня не пробрасываются почему-то.
Именнованые волумы создаю аналогично.
Докерфайл такой
выполняем docker-compose up — все запустилось
в проброшенную туда папку в хост-машине добавляем файлов, заходим внутрь через docker-compose exec web bash и этих файлов не видим.
Внутри контейнера создаем новые файлы, в своей машине их тоже не видим.
Гасим машину через docker-compose down, запускаем снова через docker-compose up и видим там прежнее состояние. И каким образом тут папки маунтятся? Ну или где этот обещанный stateless, если они не замаунтились, а скопировались?
Ну и разве можно это использовать как замену вагранта для локальной разработки? Мне нужно чтобы локальные изменения автоматически применялись в контейнере и наоборот. По документации вроде как это можно сделать, но у меня не работает.
Хост — OS X. Если использовать неименновые волумы то внутрь они у меня не пробрасываются почему-то.
Именнованые волумы создаю аналогично.
version: '3.2'
services:
web:
build: .
volumes:
- django:/app
command: python /app/manage.py runserver 0.0.0.0:8000
ports:
- "8000:8000"
volumes:
django:
driver_opts:
type: none
device: /Users/alex/test_docker/src/
o: bind
Докерфайл такой
FROM python:2.7-slim
ENV PYTHONUNBUFFERED 1
RUN pip install Django==1.9.7
RUN mkdir /app
ADD ./src /app
WORKDIR /app
EXPOSE 8000
выполняем docker-compose up — все запустилось
в проброшенную туда папку в хост-машине добавляем файлов, заходим внутрь через docker-compose exec web bash и этих файлов не видим.
Внутри контейнера создаем новые файлы, в своей машине их тоже не видим.
Гасим машину через docker-compose down, запускаем снова через docker-compose up и видим там прежнее состояние. И каким образом тут папки маунтятся? Ну или где этот обещанный stateless, если они не замаунтились, а скопировались?
Ну и разве можно это использовать как замену вагранта для локальной разработки? Мне нужно чтобы локальные изменения автоматически применялись в контейнере и наоборот. По документации вроде как это можно сделать, но у меня не работает.
Sign up to leave a comment.
Продвинутое конфигурирование Docker Compose (перевод)