Как эффективно использовать Docker + Docker-compose при разработке?
 но к ним нельзя подключиться извне (из-за использования networks, а как открыть нетворк - 
 догадаться нужно самому)
А через директивы ports - разве не прокидываются нужные порты из контейнеров наружу? При внесении каких-то изменений в основное приложение 
 можно лишь надеяться что они когда-то появятся в контейнере
Если вы вносите изменения в проект который примаплен через volume - то контейнер их тут же видит. 
Умеет ли ваше приложение видеть что локальные файлы изменились, и применять их - это уже другой вопрос.
Но даже если не умеет - нет никаких проблем перестартануть нужный контейнер после внесения каких-либо изменений. Можно пять раз удалить контейнер с приложением, потом десять раз удалить образ
 никакие изменения никуда не попадут. 
Не знаю как у вас построено - но приведу насчет примеров с проектами на python.
В Python создается папка с виртуальным окружением, куда устанавливаются все необходимые библиотеки для работы. Эта папка мапится вместе с проектом в контейнер. При этом используется контейнер python из стандартного образа на все проекты, а виртуальное окружение - из примапленной директории. Нет необходимости ничего дополнительно устанавливать в контейнеры. Поэтому что вы там пытаетесь делать с образами - непонятно... Использовать при этом виртуальное окружение на локальной машине, запуская приложение через него - нельзя, 
 потому что нетворк баз данных где-то там локальный.
Ну тут определиться - используете докер для этого, или виртуальное окружение на своей машине.
Если хотите одновременно использовать и то и другое - прокидывайте порты.
Как-то вы не очень разобрались.
Выкиньте "networks:". В вашем случае он не нужен.
Добавте "ports", там где вы хотите пользоваться пользоваться сервисом. К примеру в postgresql контейнере. 
Вот этот файл ".env" выкиньте его тоже, если у вас не много переменных впишите их так.
Вообще делать контейнер для не доконца работающей программы слысла нет. Можно поднять базу данных и всякие вдругие сервисы, а саму программу запускать локально и пусть она обращается к тому, что крутся в контейнерах. Когда будет готова первая версия, её можно уже будет завернуть в контейнер.