Docker Compose non offre la funzionalità richiesta. La costruzione del templating dei file Docker di Discourse consente risultati Docker flessibili. Con Compose, tutto ciò che si ha è un possibile set di Dockerfile fissi che possono risultare in un gruppo di container.
Nella mia configurazione di Discourse, utilizzo un singolo container con Discourse e nginx tramite un socket UNIX. PostgreSQL e Redis sono un servizio sull’host. Questa è una deviazione piuttosto significativa dalla configurazione predefinita, ma è possibile fin da subito.
È parzialmente possibile con Compose, forse utilizzando la funzionalità dei profili piuttosto mal progettata. Ma anche in quel caso è piuttosto disordinato. Oppure dovresti fornire file Compose diversi per ogni variazione.
Stai solo spostando il problema.
Una configurazione Compose pulita per Discourse includerebbe i seguenti servizi in container separati:
- Discourse
- nginx
- PostgreSQL
- Redis
Discourse e nginx devono condividere un volume, niente di complicato.
PostgreSQL e Redis… sono cose che potresti voler ospitare altrove, e non avere un container specifico per Discourse per esse. E ora Docker Compose diventa un problema: docker compose up -d avvierà il tuo PostgreSQL indesiderato. Ok, quindi lo facciamo diventare docker compose --profile postgresql up -d per avviare la configurazione base di Discourse e un container PostgreSQL. docker compose --profile postgresql --profile redis up -d per la configurazione del container Discourse “completa” e autonoma. Faresti meglio a non dimenticare un argomento --profile ..., perché altrimenti avrai più problemi.
Quindi, per una migliore UX, crei un launcher che si occupi di creare il comando Docker Compose desiderato. Ora siamo un po’ tornati al punto di partenza. Tranne che le modifiche al container nginx non sono ancora possibili. Quindi ho bisogno di un container nginx-http e di un container nginx-unix che dovrebbero essere mutuamente esclusivi? …
Certo, la gestione dei plugin potrebbe essere migliore, ma farlo con Docker Compose, sarà un inferno.