Позвольте мне добавить свой собственный ответ, потому что я считаю, что другие упускают из виду Docker.
Использование VOLUME
в Dockerfile - это правильный путь ™, потому что вы даете Docker знать, что определенный каталог содержит постоянные данные. Docker создаст том для этих данных и никогда не удалит его, даже если вы удалите все контейнеры, которые его используют.
Он также обходит файловую систему union, так что том фактически является фактическим каталогом, который монтируется (для чтения-записи или только для чтения) в нужном месте во всех контейнерах, которые его используют.
Теперь, чтобы получить доступ к этим данным с хоста, вам нужно только проверить свой контейнер:
# docker inspect myapp
[{
.
.
.
"Volumes": {
"/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
"/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
"/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
},
"VolumesRW": {
"/var/www": false,
"/var/cache/nginx": true,
"/var/log/nginx": true
}
}]
Обычно я создаю символические ссылки в каком-нибудь стандартном месте, таком как / srv , чтобы я мог легко получить доступ к томам и управлять данными, которые они содержат (только для томов, которые вам нужны ):
ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log