Docker compose vždy spouští a zastavuje kontejnery v pořadí závislosti nebo sekvenčním pořadí v souboru, pokud není zadáno. Ale docker-compose nezaručuje, že počká, dokud se kontejner závislostí nespustí. Můžete odkázat
zde pro další podrobnosti. Problém je tedy v tom, že vaše databáze není připravena, když váš spring-mysql
kontejner se pokusí o přístup k databázi. Takže doporučeným řešením je, že byste mohli použít wait-for-it.sh
nebo podobný skript pro zabalení vašeho spring-mysql
aplikace začínající ENTRYPOINT
.
Jako příklad použijete wait-for-it.sh
váš ENTRYPOINT
ve vašem Dockerfile by se měl po zkopírování výše uvedeného skriptu do kořenového adresáře vašeho projektu změnit na následující:
ENTRYPOINT ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "app.jar"]
A dvě další důležité věci, které je třeba zvážit, jsou:
- Nepoužívejte odkazy, jsou zastaralé měli byste místo toho použít uživatelsky definovanou síť. Všechny služby v souboru docker-compose budou v jedné uživatelem definované síti, pokud žádnou síť explicitně nedefinujete. Takže stačí odstranit odkazy z nového souboru.
- Není nutné publikovat port pro kontejner dockeru, pokud jej používáte pouze v rámci uživatelem definované sítě.