<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Datenbank |</title><link>https://kurse.richter.consulting/tags/datenbank/</link><atom:link href="https://kurse.richter.consulting/tags/datenbank/index.xml" rel="self" type="application/rss+xml"/><description>Datenbank</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>de</language><lastBuildDate>Sat, 07 Dec 2024 00:00:00 +0000</lastBuildDate><image><url>https://kurse.richter.consulting/media/logo.svg</url><title>Datenbank</title><link>https://kurse.richter.consulting/tags/datenbank/</link></image><item><title>Erster Container für Entwicklung</title><link>https://kurse.richter.consulting/courses/container/db_container/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/db_container/</guid><description>&lt;p&gt;Für die erste Nutzung als Entwickler, werden wir ein vorhandenes Beispielprojekt aus dem
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;g fill="#181616"&gt;&lt;path fill-rule="evenodd" d="M64 5.103c-33.347 0-60.388 27.035-60.388 60.388c0 26.682 17.303 49.317 41.297 57.303c3.017.56 4.125-1.31 4.125-2.905c0-1.44-.056-6.197-.082-11.243c-16.8 3.653-20.345-7.125-20.345-7.125c-2.747-6.98-6.705-8.836-6.705-8.836c-5.48-3.748.413-3.67.413-3.67c6.063.425 9.257 6.223 9.257 6.223c5.386 9.23 14.127 6.562 17.573 5.02c.542-3.903 2.107-6.568 3.834-8.076c-13.413-1.525-27.514-6.704-27.514-29.843c0-6.593 2.36-11.98 6.223-16.21c-.628-1.52-2.695-7.662.584-15.98c0 0 5.07-1.623 16.61 6.19C53.7 35 58.867 34.327 64 34.304c5.13.023 10.3.694 15.127 2.033c11.526-7.813 16.59-6.19 16.59-6.19c3.287 8.317 1.22 14.46.593 15.98c3.872 4.23 6.215 9.617 6.215 16.21c0 23.194-14.127 28.3-27.574 29.796c2.167 1.874 4.097 5.55 4.097 11.183c0 8.08-.07 14.583-.07 16.572c0 1.607 1.088 3.49 4.148 2.897c23.98-7.994 41.263-30.622 41.263-57.294C124.388 32.14 97.35 5.104 64 5.104z" clip-rule="evenodd"/&gt;&lt;path d="M26.484 91.806c-.133.3-.605.39-1.035.185c-.44-.196-.685-.605-.543-.906c.13-.31.603-.395 1.04-.188c.44.197.69.61.537.91zm2.446 2.729c-.287.267-.85.143-1.232-.28c-.396-.42-.47-.983-.177-1.254c.298-.266.844-.14 1.24.28c.394.426.472.984.17 1.255zm2.382 3.477c-.37.258-.976.017-1.35-.52c-.37-.538-.37-1.183.01-1.44c.373-.258.97-.025 1.35.507c.368.545.368 1.19-.01 1.452zm3.261 3.361c-.33.365-1.036.267-1.552-.23c-.527-.487-.674-1.18-.343-1.544c.336-.366 1.045-.264 1.564.23c.527.486.686 1.18.333 1.543zm4.5 1.951c-.147.473-.825.688-1.51.486c-.683-.207-1.13-.76-.99-1.238c.14-.477.823-.7 1.512-.485c.683.206 1.13.756.988 1.237m4.943.361c.017.498-.563.91-1.28.92c-.723.017-1.308-.387-1.315-.877c0-.503.568-.91 1.29-.924c.717-.013 1.306.387 1.306.88zm4.598-.782c.086.485-.413.984-1.126 1.117c-.7.13-1.35-.172-1.44-.653c-.086-.498.422-.997 1.122-1.126c.714-.123 1.354.17 1.444.663zm0 0"/&gt;&lt;/g&gt;&lt;/svg&gt;
&lt;/span&gt;
nehmen. Es liegt im Unterordner &lt;code&gt;blazor-postgres&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Wie der Name schon andeutet, handelt es sich um eine Web-Anwendung mit Blazor. Die Anwendung nutzt zur Datenspeicherung die Datenbank Postgres. Die Datenbank wollen wir als Container ausführen. Das bietet folgende Vorteile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keine großen Administrator Vorkenntnisse zu Postgres Datenbank notwendig&lt;/li&gt;
&lt;li&gt;Wir können jederzeit entscheiden, welche Version der Datenbank wir nutzen wollen (z.B. kann eine ältere Version der Applikation eine ältere DB Version erfordern - für Fehlerkorrekturen)&lt;/li&gt;
&lt;li&gt;Wir können sehr schnell einen &amp;ldquo;sauberen&amp;rdquo; Zustand der Datenbank erzeugen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="starten-der-applikation"&gt;Starten der Applikation&lt;/h2&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Falls noch nicht geschehen, müssen Sie die
für Ihr Betriebssystem installieren.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Öffnen Sie den Projektordner in dem Editor Ihrer Wahl. Ich nutze dafür VS Code mit der installierten Erweiterung &amp;ldquo;C# DevKit&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Versuchen Sie die App nur zu starten, ohne dass wir aktuell eine passende Datenbank dazu haben.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Da die Anwendung bereits beim Start eine Verbindung zur Datenbank erfordert, scheitert der Start mit einer Fehlermeldung.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Die Starteinstellungen von /Users/eugen/src/container-kurs/blazor-postgres/Properties/launchSettings.json werden verwendet…
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Buildvorgang wird ausgeführt...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fail: Microsoft.EntityFrameworkCore.Database.Connection&lt;span class="o"&gt;[&lt;/span&gt;20004&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; An error occurred using the connection to database &lt;span class="s1"&gt;&amp;#39;devdb&amp;#39;&lt;/span&gt; on server &lt;span class="s1"&gt;&amp;#39;tcp://localhost:5432&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unhandled exception. Npgsql.NpgsqlException &lt;span class="o"&gt;(&lt;/span&gt;0x80004005&lt;span class="o"&gt;)&lt;/span&gt;: Failed to connect to 127.0.0.1:5432
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ---&amp;gt; System.Net.Sockets.SocketException &lt;span class="o"&gt;(&lt;/span&gt;61&lt;span class="o"&gt;)&lt;/span&gt;: Connection refused
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.Connect&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.Connect&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.RawOpen&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.&amp;lt;Open&amp;gt;g__OpenCore&lt;span class="p"&gt;|&lt;/span&gt;209_0&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlConnector conn, String username, SslMode sslMode, GssEncryptionMode gssEncMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.Open&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.PoolingDataSource.OpenNewConnector&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.PoolingDataSource.&amp;lt;Get&amp;gt;g__RentAsync&lt;span class="p"&gt;|&lt;/span&gt;33_0&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.NpgsqlConnection.&amp;lt;Open&amp;gt;g__OpenAsync&lt;span class="p"&gt;|&lt;/span&gt;42_0&lt;span class="o"&gt;(&lt;/span&gt;Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.NpgsqlConnection.Open&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection&lt;span class="o"&gt;(&lt;/span&gt;Boolean errorsExpected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal&lt;span class="o"&gt;(&lt;/span&gt;Boolean errorsExpected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open&lt;span class="o"&gt;(&lt;/span&gt;Boolean errorsExpected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader&lt;span class="o"&gt;(&lt;/span&gt;RelationalCommandParameterObject parameterObject&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.GetAppliedMigrations&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlHistoryRepository.GetAppliedMigrations&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetAppliedMigrations&lt;span class="o"&gt;(&lt;/span&gt;DatabaseFacade databaseFacade&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetPendingMigrations&lt;span class="o"&gt;(&lt;/span&gt;DatabaseFacade databaseFacade&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at BlazorWebAppMovies.Data.SeedData.Initialize&lt;span class="o"&gt;(&lt;/span&gt;IServiceProvider serviceProvider&lt;span class="o"&gt;)&lt;/span&gt; in /Users/eugen/src/container-kurs/blazor-postgres/Data/SeedData.cs:line &lt;span class="m"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Program.&amp;lt;Main&amp;gt;&lt;span class="k"&gt;$(&lt;/span&gt;String&lt;span class="o"&gt;[]&lt;/span&gt; args&lt;span class="k"&gt;)&lt;/span&gt; in /Users/eugen/src/container-kurs/blazor-postgres/Program.cs:line &lt;span class="m"&gt;23&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="start-der-postgres-datenbank"&gt;Start der Postgres Datenbank&lt;/h2&gt;
&lt;p&gt;Damit die Anwendung starten können, müssen wir die Postgres Datenbank starten. Dazu suchen wir auf dem größten Repository für Container Images, dem
von Docker Inc., nach Postgres.&lt;/p&gt;
&lt;h3 id="kategorisierung-in-docker-hub"&gt;Kategorisierung in Docker Hub&lt;/h3&gt;
&lt;p&gt;Die Suche gibt uns sehr viele Ergebnisse zu Postgres, da jeder auf diesem Hub Images veröffentlichen kann. Docker Hub hilft uns ein wenig dabei, das richtige Image herauszufinden, in dem es die Image-Repositories kategorisiert.&lt;/p&gt;
&lt;p&gt;Es gibt sogenannte &amp;ldquo;offizielle&amp;rdquo; Image, die direkt von den Entwicklern der jeweiligen Software zur Verfügung gestellt werden. Nach der Verifizierung, bekommen diese ein Siegel &amp;ldquo;Docker Official Image&amp;rdquo;. Damit sind solche Images am vertrauenswürdigsten. Man erkenn solche Images relativ einfach, an den Namen.&lt;/p&gt;
&lt;p&gt;Die Namen von den offiziellen Images, haben keinen Präfix. Das haben wir bereits bei &lt;code&gt;nginx&lt;/code&gt; gesehen. Auch da bestand der Image-Name nur aus dem Namen der Software. Bei Postgres heißt das Image auch einfach &lt;code&gt;postgres&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Eine weitere Kategorie sind die &amp;ldquo;Verified Publisher&amp;rdquo;. Dabei handelt es sich zwar nicht um die &amp;ldquo;Ersteller&amp;rdquo; der jeweiligen Software, aber um Firmen, die von Docker Inc. validiert und für vertrauenswürdig befunden worden. Es sind of Firmen, die selbst Ihr Geld mit Containern verdienen und optimierte Images für bestimmte Bereiche liefern. Zu den &amp;ldquo;Verified Publisher&amp;rdquo; gehören zum Beispiel&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CircleCI: Ein CI/CD as a Service Anbieter&lt;/li&gt;
&lt;li&gt;Microsoft&lt;/li&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;Bitnami: Anbieter von VM Images / Container Images&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aussuchen-der-notwendigen-parameter"&gt;Aussuchen der notwendigen Parameter&lt;/h3&gt;
&lt;p&gt;Wir nutzen für unseren Zweck das offizielle Image von Postgres. Wenn wir in der Suche diesen auswählen, erscheint die Detail-Seite des
. Hier finden wir die Beschreibung, wie das vorhandene Container-Image beim Starten mit Parametern angepasst werden kann. Oft stehen auch Informationen, welche Version, Basis-Images und Architekturen unterstützt werden.&lt;/p&gt;
&lt;p&gt;Das Postgres Repository hat zum Beispiel Images für:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Postgres-Versions: 18, 17, 16, 15, 14, 13, 12&lt;/li&gt;
&lt;li&gt;Architekturen: amd64, arm32v5, arm32v6, arm32v7, arm64v8, i386, mips64le, ppc64le, riscv64, s390x&lt;/li&gt;
&lt;li&gt;Basis-Images
&lt;ul&gt;
&lt;li&gt;alpine: Basiert auf Alpine-Linux&lt;/li&gt;
&lt;li&gt;bullseye: Basiert auf Debian Trixie (13)&lt;/li&gt;
&lt;li&gt;bookworm: Basiert auf Debian Bookworm (12)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Um auf die Datenbank in unserer Anwendung zugreifen zu können, müssen wir folgende Einstellungen für die Datenbank wissen / setzen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Benutzername
&lt;ul&gt;
&lt;li&gt;Kann im offiziellen Image über Umgebungsvariable &lt;code&gt;POSTGRES_USER&lt;/code&gt; gesetzt werden (Standardwert ist &lt;code&gt;postgres&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Passwort
&lt;ul&gt;
&lt;li&gt;Muss im offiziellen Image über Umgebungsvariable &lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt; gesetzt werden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Datenbankname
&lt;ul&gt;
&lt;li&gt;Kann im offiziellen Image über Umgebungsvariable &lt;code&gt;POSTGRES_DB&lt;/code&gt; gesetzt werden (Standardwert entspricht dem Benutzernamen)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Umgebungsvariablen werden an Docker Runtime mit dem Parameter &lt;code&gt;-e&lt;/code&gt; übergeben (kann auch mehrmals verwendet werden).&lt;/p&gt;
&lt;p&gt;Aus den gesammelten Informationen, können wir nun den geforderten (kürzesten) Aufruf ableiten:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -e &lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devuser &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devpassword &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devdb &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 5432:5432 -d postgres:18-alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-e POSTGRES_USER=devuser&lt;/code&gt;: setzt den Benutzernamen auf &lt;code&gt;devuser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e POSTGRES_PASSWORD=devpassword&lt;/code&gt;: setzt das Passwort auf &lt;code&gt;devpassword&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e POSTGRES_DB=devdb&lt;/code&gt;: setzt die Datenbankname auf &lt;code&gt;devdb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 5432:5432&lt;/code&gt;: ordnet den Standard Port von Postgres zu demselben Port auf unserem Host zu&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postgres:18-alpine&lt;/code&gt;: startet den Postgres Container mit der Version 18 und dem Alpine-Basis-Image&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/db_container/postgres_container.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Postgres Container in Docker Desktop&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="starten-der-applikation-mit-laufender-datenbank"&gt;Starten der Applikation mit laufender Datenbank&lt;/h3&gt;
&lt;p&gt;Nun läuft die Postgres Datenbank im Hintergrund (in der Version 18), so dass die App auf diese Zugreifen kann. Da wir einige Einstellungen nicht angegeben haben, werden dabei Standardwerte genutzt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--name&lt;/code&gt;: Wir haben dem Container keinen expliziten Namen gegeben. Aus diesem Fall wird dieser durch die Runtime &amp;ldquo;gewürfelt&amp;rdquo;. Bei meinem ersten Start war der Name &lt;code&gt;funny_austin&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn wir jetzt die Applikation starten. In der Ausgabe wird auch die URL Angezeigt, unter der die Applikation erreichbar ist.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using launch settings from /Users/eugen/src/container-kurs/blazor-postgres/Properties/launchSettings.json...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Building...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fail: Microsoft.EntityFrameworkCore.Database.Command&lt;span class="o"&gt;[&lt;/span&gt;20102&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Failed executing DbCommand &lt;span class="o"&gt;(&lt;/span&gt;10ms&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Parameters&lt;/span&gt;&lt;span class="o"&gt;=[]&lt;/span&gt;, &lt;span class="nv"&gt;CommandType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Text&amp;#39;&lt;/span&gt;, &lt;span class="nv"&gt;CommandTimeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;ProductVersion&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM &lt;span class="s2"&gt;&amp;#34;__EFMigrationsHistory&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORDER BY &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fail: Microsoft.EntityFrameworkCore.Database.Command&lt;span class="o"&gt;[&lt;/span&gt;20102&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Failed executing DbCommand &lt;span class="o"&gt;(&lt;/span&gt;1ms&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Parameters&lt;/span&gt;&lt;span class="o"&gt;=[]&lt;/span&gt;, &lt;span class="nv"&gt;CommandType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Text&amp;#39;&lt;/span&gt;, &lt;span class="nv"&gt;CommandTimeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;ProductVersion&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM &lt;span class="s2"&gt;&amp;#34;__EFMigrationsHistory&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORDER BY &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.EntityFrameworkCore.Migrations&lt;span class="o"&gt;[&lt;/span&gt;20411&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Acquiring an exclusive lock &lt;span class="k"&gt;for&lt;/span&gt; migration application. See https://aka.ms/efcore-docs-migrations-lock &lt;span class="k"&gt;for&lt;/span&gt; more information &lt;span class="k"&gt;if&lt;/span&gt; this takes too long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.EntityFrameworkCore.Migrations&lt;span class="o"&gt;[&lt;/span&gt;20402&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Applying migration &lt;span class="s1"&gt;&amp;#39;20241206073458_Init&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.Hosting.Lifetime&lt;span class="o"&gt;[&lt;/span&gt;14&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Now listening on: http://localhost:5216
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.Hosting.Lifetime&lt;span class="o"&gt;[&lt;/span&gt;0&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Application started. Press Ctrl+C to shut down.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Öffnen Sie die Applikation nun unter der ausgegebenen Adresse &lt;code&gt;http://localhost:5216&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/db_container/blazor_app.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Blazor App mit DB Verbindung&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item></channel></rss>