пробрасывается, но когда делаю изменения из контейнера в этой папке, они не сохраняются. образ собирается из Dockerfile, запускаю через docker-compose, вот такие настройки в них касательно пробрасываемого тома:
Dockerfile
ADD . /code/
docker-compose.yml
volumes:
code:
driver: local
driver_opts:
type: 'none'
o: 'bind'
device: '.'
Ты сначала опиши, зачем тебе сохранять изменения в папку на хосте. Ну и реализовано это неправильно
Всё просто, хочу каждому контейнеру скормить диск /dev/sdX или nvme, пытаюсь понять последующую зависимость.
Мне надо из контейнера Django сформировать статику через python manage.py collectstatic, это команда создает папку static в папке проекта, сам проект пробрасывается внутрь контейнера. Так вот после выполнения данной команды, находясь в контейнере я виже, что команда отрабатывает и папка появляется, потом выхожу из контейнера, папки static на хостовой машине в папке проекта нет, захожу в контейнер, папки там тоже нет.
ceph или gluster поднять, утилизировать пространство
Без privileged режима контейнеры не имеют доступа к /dev
А зачем сохранять статику на хост? Почему не билдить ее на этапе сборки образа, и оставлять там?
> папка пробрасывается, но когда делаю изменения из контейнера в этой папке, они не сохраняются. Это утверждение ложное) В приведенном куске docker-compose.yml нет информации о том, как используется volume/mount. Или давай полную информацию или иди читать доку сам.
Меньше узких мест, проще конструктив, административки меньше. Структура dev#1, контейнеры, dev x - y диски для данных. Контейнер переехал на другой хост, диски новые. Всё что в контейнере работает по своим правилам, а куда писать может быть любым.
возможно проще отдать дирректория с файловой системой
Да там и сам volume описан неправильно
возможно тебе нужен нас или сан, который примонтирован ко всем хостам куда может переезжать контейнер
это уже для dev#1, есть
Ну и тут ты абстракцию прибиваешь к железу, зачем?
Docker - не про хранение данных на физических носителях, а про развертывание сервиса в своем уникальном окружении. Хочешь контролировать использование дискового пространства - выноси все, что тебе из контейнеров надо маунтами на хост и следи за дисковым пространством как твоей душе угодно. Это не проблема Docker'а.
Потому что выглядит как "Docker == VM без лишних заморочек"
Спасибо. Я не говорю о проблеме.
Ну если я правильно понял - то речь о подходе, как сделать) Я мог интерпретировать и неправильно
Всё правильно, нормально.😊
действительно верно, так будет правильно, благодарю! но кейс изменения данных из контейнера также интересен.
version: '3.1' services: web: build: . command: bash -c "uwsgi --ini progresscounter_uwsgi.ini --uid www-data --gid www-data" volumes: - code:/code volumes: code: driver: local driver_opts: type: 'none' o: 'bind' device: '.'
К примеру, SAN я отдаю для dev1, где хостяться только данные контейнеров, devXY на хостах которые просто есть. Контейнер может переезжать куда угодно в рамках SANили dev1, где так же, dev1, может быть зеркалом на gluster. Все хосты имеют другие dev. Контейнер же имея доступ к пулу dev своими правилами организует данные.
Убираешь раздел volumes в корне файла. В web в разделе volumes пишешь: - ./myfolder:/code Где ./myfolder - папка на хосте. Все.
Кроме SAN, есть технология StorageBridgeBay, в рамках общего пула дисков для 2х хостов.
либо просто полка по SAS подцеплена для 2х хостов, но арбитраж уже на стороне базовой ОС.
ок, спасибо за направление, дичь пофиксю
ИМХО правильным решением будет разделить организацию работы с дисковым пространством и развертыванием приложений в Docker. Ты знаешь, что при запуске Docker приложение смотрит в определенные директории на хосту, они же у тебя являются примонтированными директориями с /dev/sdX. А чем является /dev/sdX - уже прям отдельный вопрос, Docker про это ничего знать не будет и ему будет норм)
хм...мысль верная, подумаю, протестирую, напишу. Спасибо.
Не пробрасывается через docker-compose.yml папка на запись чего-то. Вроде элементарный конфиг. Монтирую локальный текущий каталог в докер в два каталога в /code и в /mnt. Если зайти в контейнер, то в /code файлы есть, а в /mnt пусто. При этом если снаружи сделать изменения в файлах и перезапустить контейнер, данные применятся (например можно изменить конфиг Django), но при этом в контейнере будет отображаться старый конфиг, на момент билда образа, а папка /mnt остается пустой. Как разрулить, чтобы на rw папка монтировалась и изменения внесенные в контейнере в примаунчинной папке появлялись на хосте? Dockerfile FROM python:3.10 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code docker-compose.ymal version: '3.1' services: web: build: . command: bash -c "uwsgi --ini mydjango_uwsgi.ini --uid www-data --gid www-data" volumes: - ./:/code - ./:/mnt
1. Зачем перезапускать контейнер для того, чтобы увидеть изменения? Папки же смонтированы в контейнер, изменения должны отображаться сразу 2. Нахера тебе сразу два пути внутри контейнера?
Потому, что мне надо чтобы контейнер создал данные в примаунченной папке, он этого не делает. И я решил попробовать еще в одну папку смаунтить посмотреть. Вторая папка для теста, mnt которая. Запускаю контейнер через компоуз в режиме -d, потом подключаюсь к нему в bash черезе docker -it, создаю папку, выхожу из баша, папки на хосте нет, Ubuntu 18.04.3 LTS
И не будет делать. Если ты хочешь, чтобы пустая папка наполнялась при запуске контейнера, это нужно делать явно в entrypoint
Обсуждают сегодня