Como rodar docker-compose tendo vários containers em repositórios diferentes

Hello everybody!

Estou com um projeto que roda em micro serviços, todos eles tem seus repositórios independentes, cada um com seu Dockerfile, docker-compose.yml e tudo mais. São 14 serviços independentes.

O problema é que quando quero rodar todo o ecossistema preciso ir de pasta em pasta e executar os respectivos docker compose up em cada serviço, além de ajustar váriaveis de ambiente como portas, urls e etc em cada projeto.

Teria alguma maneira de fazer uma espécie de "super" docker-compose.yml com todos os containers, networks e tudo mais, e quando quisesse rodar o ecossistema daria um docker compose up e isso subiria todos os containers?

Obrigado por ler até aqui :)

Pegando o gancho do que falou o @glink aí em cima, eu tenho o mesmo "problema" em alguns projetos e também costumo dividí-los em repositórios, cada um com suas definições.

Minha recomendação pra juntar o útil ao agradável, é criar um repositório no Git contendo submódulos com todos os repositórios e, na raiz desse repositório, criar um docker-compose completo com todos. Como na imagem abaixo, de um repositório meu:

Github

Nesse docker-compose você coloca todos os seus serviços, networks e volumes. Recomendo, caso julgue necessário, criar um arquivo .env com todas as variáveis de ambiente compartilhadas pra facilitar sua vida e referenciar no compose como ${NOME_VARIAVEL}. Assim você evita ter que alterar todos os serviços caso precise alterar uma variável compartilhada por mais de um.

Espero ter ajudado.

Olá boa tarde! To pensando em implementar algo nesse sentido mesmo man, no meu caso só não vou subir pro git, mas vou deixar esse `docker-compose.yml`na minha máquina aqui, ele vai ser meio que um _Frankestein_ de junção dos outros docker-compose de cada projeto, mas acredito que vai funcionar, vlww!

Opah o que eu normalmente tento fazer eh ter cada microservico num repositorio. Em cada serviço crio uma imagem docker independente, e depois o deploy seja ele para que ambiente for utilizaria essas imagens docker.

In prod/testing posso usar kubernetes para gerir os deployments, e no ambiente de dev posso ter um docker compose que combina e configura os serviços para trabalhar...

Mas isto vem da minha forma de trabalhar, BE com docker faz uma api no FE normalmente os meus colegas usam o servidor do npm...

PS: espero ter ajudado...

A ideia do docker-composer é justamente agrupar esses diversos microserviços, criar dependencia entre eles, conectar tudo em rede, etc.. etc...

Geralmente você vai ter um docker-composer na pasta raiz do projeto e dentro desse composer você cria os "services" pra cada micro serviço que estão nas subpastas.

Dai com docker-compose up -d voce sobre tudo de uma vez e com docker-compose down você derruba tudo.

Fez sentido ou seu caso é mais específico? Se for diferente, compartilha mais detalhes pra gente bater cabeça juntos

Olá boa tarde! Sim, Tenho um docker-compose em cada repositório, o cenário é bem parecido com o que o @pauloleal falou ali, ou seja, tenho vários repositórios separados mas que os serviços se comunicam entre si, e quando quero rodar localmente todo o ecossistema de microservices, preciso abrir cada pasta e rodar o `docker compose up`, só que são 14 serviços, então são 14 terminais abertos, com eu rodando `docker compose up` em cada um deles. Dai estava maquinando alguma forma de poder startar toda essa galera de uma vez, estava em dúvida se tinha alguma ferramente que fazia isso, ou alguma boa prática pra essa situação, mas a solução que estou pensando aqui tá sendo uma coisa parecida com o que o @pauloleal sugeriu, vou criar um `docker-compose.yml` na minha pasta raiz onde estão todos os repositórios/pastas de cada serviço, e pegaria cada `docker-compose.yml` de cada projeto e juntaria num "super docker-compose.yml" pra eu startar por ele, dai ele subiria os 14 containers numa pancada só. O que acha?
Aparentemente você não vai precisar copiar o conteúdo de cada "sub docker-compose". Nesse link eles tratam da funcionalidade "extend" do compose. https://stackoverflow.com/questions/55650342/import-docker-compose-file-in-another-compose-file/55652819 Então ficaria algo assim no seu primeiro projeto ```yaml services: nginx_a: image: nginx:latest container_name: nginx ports: - 81:80 - 1443:443 ``` E no seu diretorio raiz: ```yaml services: nginx_projeto_a: extends: file: projeto-a/docker-compose.yml.yml service: nginx_a nginx_projeto_b: extends: file: projeto-b/docker-compose.yml.yml ``` Testa ai e lembra de dar um feedback aqui se funcionou ou não!
Voltando aqui pra falar um pouco sobre a solução, li sobre a documentação do extends no site do docker lá mesmo, comecei implementar juntando alguns containers/serviços aqui, mas acabei caindo em um problema relacionado ao *depends_on*, que não pode ser usado nesse escopo, (não tenho certeza, mas foi o que entendi), ele só poderia ser usado nos *docker-compose.yml filhos*, e vi que alguns serviços estão sem um docker-compose.yml funcional, então estou corrigindo isso, e eles estando funcionais, vou seguir mais a frente com a implementação do extends. E aproveitando, alguns serviços estão como `network_mode: host`, pois estou conectando eles a bancos rodando na minha máquina, teria algum conflito nesse sentido?
Caramba, massa demais, não conhecia essa feature, vou testar, se funcionar vai ajudar demais!!! Vlw