В чём разница монтирования папок в docker на конкретном примере?

postgres: -v $HOME/docker/volumes/postgres:/var/lib/postgresql/data postgres
nginx: -v $HOME/docker/volumes/nginx:/usr/share/nginx/html nginx

в случае с postgres файлы из контейнера /var/lib/postgresql/dataскидываются в локуальную папку хоста $HOME/docker/volumes/postgres

но в случае с nginx ничего не скидывается, и чтобы запустилась страничка, необходимо наличие файла index.html в папке хоста $HOME/docker/volumes/nginx

Не могу понять - команды монтирования одинаковые, но процессы разные, почему? Docker только начал изучать. Спасибо!


Ответы (1 шт):

Автор решения: Total Pusher

Postgres

Postgres использует каталог /var/lib/postgresql/data для хранения файлов БД.

Изначально, перед самым первым стартом, этот каталог пустой. Можем это проверить. Запустите:

docker run -it --rm --entrypoint= postgres:latest ls -la /var/lib/postgresql/data

# Вывод:
drwxrwxrwt 2 postgres postgres 4096 Feb 13 01:58 .
drwxr-xr-x 1 postgres postgres 4096 Feb 13 01:58 ..

Получается, что каталог присутствует в образе (и созданном на основе его контейнере), но пустой.

Когда Postgres стартует первый раз, он создает там файлы базы данных, как минимум - дефолтную БД postgres. В дальнейшем эти файлы используются, и не создаются заново, так как "монтируются", то есть постоянно хранятся на машине.

Nginx

У Nginx каталог /usr/share/nginx/html должен содержать файлы - они изначально требуются Nginx и изначально присутствуют в образе. Давайте проверим:

docker run -it --rm --entrypoint= nginx:latest ls -la /usr/share/nginx/html

# Вывод:
-rw-r--r-- 1 root root  497 Feb 14 16:03 50x.html
-rw-r--r-- 1 root root  615 Feb 14 16:03 index.html

И когда Nginx стартует, он не находит этих файлов, от чего крашится. Ну так он устроен, что не создает дефолтные, они уже должны быть.

Чтобы заработало, сохраните в монтируемый каталог $HOME/docker/volumes/nginx эти два файла. Я это делаю через docker cp, только не монтируйте в этот момент туда ничего.

Монтирование

Мне кажется, вы не до конца понимаете как работает монтирование. Если вы думаете, что файлы, которые находятся в образе/контейнере, после монтирования появятся на хост-машине, это не так. Все идет в обратную сторону.

When you use a bind mount, a file or directory on the host machine is mounted into a container.

Из маны

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

PS.

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

→ Ссылка