Ich wollte das Gleiche wie du tun – wir betreiben Discourse auf Amazon ECS, daher mussten wir in der Lage sein, nur das Web-Image zu bauen und in eine Registry zu pushen. Ich wollte den Discourse-Build-Prozess nicht hacken, da wir so nah wie möglich an der unterstützten Installation bleiben möchten.
Stattdessen nutzen wir das normale launcher-Skript, um auf einem lokalen Rechner ein Setup mit zwei Containern zu erstellen, ignorieren dabei jedoch den Daten-Container und pushen den Web-Container in die Registry. Zur Laufzeit überschreiben wir die Postgres- und Redis-Verbindungsdetails über Umgebungsvariablen.
Das Bereitstellen des neuen Images ist ein dreistufiger Prozess:
-
Sichere Pre-Migrationen ausführen. Lass ECS diesen Befehl (mit dem neuen Image) ausführen:
SKIP_POST_DEPLOYMENT_MIGRATIONS=1 rake db:migrate -
Das neue Image bereitstellen. Aktualisiere den ECS-Service.
-
Post-Migrationen ausführen. Lass ECS diesen Befehl ausführen:
SKIP_POST_DEPLOYMENT_MIGRATIONS=0 rake db:migrate
Es ist wahrscheinlich verschwenderisch, während des Image-Builds einen lokalen Daten-Container laufen zu lassen, aber dadurch können wir die standardmäßige web.template.yml verwenden, ohne uns Gedanken darüber machen zu müssen, welche Teile mit der Datenbank oder Redis kommunizieren.