Как монтировать каталог в контейнере докеров для размещения

Предположим, что у меня есть приложение с этим простым файлом Docker:

//...
RUN configure.sh --logmyfiles /var/lib/myapp
ENTRYPOINT ["starter.sh"]
CMD ["run"]
EXPOSE 8080
VOLUME ["/var/lib/myapp"]

И я запускаю контейнер из этого:

sudo docker run -d --name myapp -p 8080:8080 myapp:latest

Таким образом, он работает правильно и сохраняет несколько журналов в /var/lib/myapp контейнера докеров.

Мой вопрос

Мне нужно, чтобы эти файлы журналов автоматически сохранялись в хосте, так как я могу монтировать /var/lib/myapp из контейнера в /var/lib/myapp на хост-сервере (без удаления текущего контейнера)?

Edit

Я также вижу Docker - Mount Directory from Container to Host, но он не решает мою проблему. Мне нужен способ резервного копирования моих файлов с докеров на хост.

Ответ 1

Во-первых, небольшая информация о Объемы докеров. Громкость монтируется только при создании контейнера. Это означает, что после того, как вы запустили контейнер, вы не сможете изменить настройки громкости. Кроме того, тома монтируются только в одну сторону: от хоста до контейнера, а не наоборот. Когда вы указываете каталог хоста, смонтированный как тома в вашем контейнере (например, например: docker run -d --name="foo" -v "/path/on/host:/path/on/container" ubuntu), это "обычный ole" linux mount --bind, что означает, что каталог хоста временно "переопределяет" каталог контейнера, Ничего на самом деле не удаляется или не перезаписывается в целевом каталоге, но из-за природы контейнеров это фактически означает, что он будет переопределен для срока службы контейнера.

Итак, у вас осталось два варианта (возможно, три). Вы можете установить каталог хоста в свой контейнер и затем скопировать эти файлы в ваш запуск script (или если вы принесите cron в свой контейнер, вы можете использовать cron, чтобы периодически копировать эти файлы в том, чтобы установить тома хоста).

Вы также можете использовать docker cp для перемещения файлов из своего контейнера на свой хост. Теперь это своего рода хакка и определенно не то, что вы должны использовать в своей автоматизации инфраструктуры. Но это очень хорошо работает для этой цели. Для этого важна разовая или отладка.

Вы также можете настроить сетевую передачу, но это довольно важно для того, что вы делаете. Однако, если вы хотите регулярно делать это для своих файлов журналов (или что-то еще), вы можете использовать что-то вроде rsyslog для перемещения этих файлов с вашего контейнера.

Ответ 2

Итак, как я могу монтировать /var/lib/myapp из контейнера в /var/lib/myapp в хост-сервере

Это наоборот: вы можете установить папку хоста в свой контейнер на docker run.

(без удаления текущего контейнера)

Я так не думаю. Прямо сейчас вы можете проверить docker inspect <containername> и посмотреть, если вы видите свой журнал в /var/lib/docker/volumes/..., связанном с томом из вашего контейнера.

Или вы можете перенаправить результат docker logs <containername> в файл хоста.
Более подробно см. этот смысл.

Альтернативой было бы установить каталог хоста как папку журнала, а затем получить доступ к файлам журнала непосредственно на хосте.

[email protected]~$ docker run -d -p 80:80 -v <sites-enabled-dir>:/etc/nginx/sites-enabled -v <certs-dir>:/etc/nginx/certs -v <log-dir>:/var/log/nginx dockerfile/nginx

[email protected]~$ ls <log-dir> 

(опять же, это относится к запущенному контейнеру, а не к существующему запуску)