2017-11-27 4 views
1

Ich habe eine .NET Core 2.0 Web API, die auf einem Docker-Container hinter einem Load Balancer (auch ein Docker Container) ausgeführt wird. Ich möchte die Web API skalieren, indem ich mehrere Container, einen pro Kunde, habe. Vor diesem Hintergrund musste ich Änderungen in der Konfiguration vornehmen, um die Kundendetails zu trennen und zu abstrahieren, damit ich die App-Einstellungen pro Kunde vornehmen kann. So kann ich appsettings.CustomerA.config, appsettings.CustomerB.config usw..net Core Docker Bild mit App-Einstellungen pro Kunde

Meine allgemeine Dockerfile ist haben würde:

FROM microsoft/aspnetcore-build AS builder 
WORKDIR /app 

# copy csproj and restore as distinct layers 
COPY ./Project/*.csproj ./ 
RUN dotnet restore 

# copy everything else and build 
COPY ./Project ./ 
RUN dotnet publish -c Release -o out 

# build runtime image 
FROM microsoft/aspnetcore 
WORKDIR /app 
COPY --from=builder /app/out ./ 
ENV ASPNETCORE_ENVIRONMENT Production 
ENTRYPOINT ["dotnet", "Project.dll"] 

Das ist alles in Ordnung, aber was ich weiß nicht, ob ich verschiedene Dockerfiles haben kann, eine pro Kunde, wo ich angeben der Kunde (nicht sicher, ob das eine gute Praxis ist oder nicht, weil ich Umgebungen mit Kunden mische, aber gleichzeitig die Umgebung für einen bestimmten Kunden ist, wenn das Sinn macht) oder ob ich eine andere Konfigurationsdatei erstellen soll, die ich kopiere abhängig von dem Kunden?

Ich nahm die Docker-Vorlage aus der Microsoft Docker-Dokumentation https://docs.docker.com/engine/examples/dotnetcore/#create-a-dockerfile-for-an-aspnet-core-application und fügte die Umgebung selbst hinzu.

Danke für die Hilfe

Antwort

2

Es ist keine separate Dockerfile für jeden Kunden oder sogar ein separates Bild zu haben, empfohlen. Dies führt schnell zu einer großen Anzahl von zu bearbeitenden Dockerfiles und wird viele Schwierigkeiten mit sich bringen, besonders wenn Sie alle Dateien/Bilder aktualisieren wollen, wenn neue Funktionen dies erfordern.

Es wird empfohlen, ein Docker-Image zu verwenden und alle kundenspezifischen Konfigurationen außerhalb des Bildes zu externalisieren.

Es gibt mehrere Möglichkeiten, wie Sie das tun können. In Docker können Sie Umgebungsvariablen an den Container übergeben, um ihn zu konfigurieren. Sie können die Umgebungsvariablen auch in eine Konfigurationsdatei schreiben und sie als Env-Datei übergeben.

Ein anderer "Docker Weg", um Zeug außerhalb des Bildes zu externalisieren, ist bind mounts zu verwenden. Sie können beim Ausführen des Containers ein Verzeichnis vom Host an den Container binden. In dem Verzeichnis können Sie Konfigurationsdateien haben, die der Container beim Start aufnehmen kann.

+0

Vielen Dank dafür. Ich werde dann den Container konfigurieren, um Mounts zu verwenden. Scheint der empfindlichste Weg, um das zu erreichen, was ich will. Ich frage mich, wie das automatisiert werden kann, wenn ich einen Schwarm benutzen will. Es ist geplant, Container auf Worker-Knoten bereitzustellen. Wenn Sie jedoch Mounts verwenden möchten, muss die Kundenkonfiguration separat auf die relevanten Knoten verteilt werden. Habe ich recht? –

+0

Ja, das stimmt. Sie müssen auf jeder Maschine konfigurieren. Sie können dieses Problem durch eine Netzwerkfreigabe wie NFS beheben. Alternativ können Sie zu einem verteilten Gerät wie FTP oder einem Schlüsselwertspeicher wie Redis wechseln, wo jeder Container seine Konfiguration basierend auf Umgebungsvariablen anfordert. – yamenk

+0

Ich sehe, das ist auch eine gute Lösung. Vielen Dank für deine Hilfe! –

Verwandte Themen