Golang-Testcontainer, das Netzwerk funktioniert nicht
Der PHP-Editor Strawberry hat bei der Verwendung von Golang-Testcontainern ein Problem festgestellt, das heißt, das Netzwerk konnte nicht ordnungsgemäß funktionieren. Golang testcontainers ist ein Tool zum Ausführen von Containern in Tests, das Entwicklern hilft, Container in einer Testumgebung schnell zu starten und zu zerstören. Bei der tatsächlichen Verwendung stellte der PHP-Editor Strawberry jedoch fest, dass die Netzwerkfunktion im Container nicht normal verwendet werden konnte, was im Test zu bestimmten Problemen führte. Als nächstes werden wir gemeinsam die Lösung für dieses Problem erforschen.
Frageninhalt
Ich versuche, einige Tests in meinem Microservice zu erstellen und möchte ein Netzwerk erstellen, an das ich meinen Datenbank-Testcontainer (Postgres) und meinen Microservice-Testcontainer anhängen werde. Egal was ich versuche, ich kann meinen Microservice nicht dazu bringen, eine Verbindung zur Datenbank herzustellen. Mein Mikroservice ist Golang und verwendet Fibre und Gorm. Ich versuche, eine Verbindung zur Datenbank in der db.go-Konfigurationsdatei wie folgt herzustellen:
func SetupDB(port string, host string) *gorm.DB { dsn := "host=" + host + " user=postgres password=password dbname=prescription port=" + port + " sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { panic("error connecting to database") } db.AutoMigrate(&model.Prescription{}) return db }
So sieht mein Testcontainer aus:
prescriptionDBContainer, err := testcontainers.GenericContainer(context.Background(), testcontainers.GenericContainerRequest{ ContainerRequest: testcontainers.ContainerRequest{ Image: "postgres", ExposedPorts: []string{postgresPort.Port()}, Env: map[string]string{ "POSTGRES_USER": "postgres", "POSTGRES_PASSWORD": "password", "POSTGRES_DB": "prescription", }, Networks: []string{network.Name}, NetworkAliases: map[string][]string{ network.Name: {"db-network"}, }, WaitingFor: wait.ForAll( wait.ForLog("database system is ready to accept connections"), wait.ForListeningPort(postgresPort), ), }, Started: true, })
prescriptionContainer, err := testcontainers.GenericContainer(context.Background(), testcontainers.GenericContainerRequest{ ContainerRequest: testcontainers.ContainerRequest{ FromDockerfile: testcontainers.FromDockerfile{Context: "../../../../prescription"}, Networks: []string{network.Name}, NetworkAliases: map[string][]string{ network.Name: {"db-network"}, }, Env: map[string]string{ "POSTGRES_USER": "postgres", "POSTGRES_PASSWORD": "password", "POSTGRES_DB": "prescription", "HOST": prescriptionDBHost, "DB_PORT": prescriptionDBPort.Port(), }, ExposedPorts: []string{pMicroPort.Port()}, WaitingFor: wait.ForListeningPort("8080"), }, Started: true, })
Vielleicht liegt es daran, dass ich einfach nicht verstehe, was während des Netzwerkverbindungsprozesses in Docker vor sich geht, aber ich bin wirklich verloren und als ich die Umgebung für HOST und DB_PORT einrichte (ich habe jede Kombination unter der Sonne ausprobiert), Es lehnt Microservices ab, die mit der Datenbank verbunden sind
Im Testcontainer des Microservices habe ich versucht:
"HOST": prescriptionDBHost, "DB_PORT": prescriptionDBPort.Port(),
prescriptionDBHost ist:
prescriptionDBHost, err := prescriptionDBContainer.Name(context.Background())
führt zur Fehlermeldung:
failed to initialize database, got error failed to connect to `host=/stoic_heyrovsky user=postgres database=prescription`: dial error (dial unix /stoic_heyrovsky/.s.PGSQL.53802: connect: no such file or directory) panic: error connecting to database
Dann habe ich versucht, das „/“ aus dem Hostnamen zu entfernen, zum Beispiel:
"HOST": strings.Trim(prescriptionDBHost,"/"), "DB_PORT": prescriptionDBPort.Port(),
Ich habe es auch versucht:
"HOST": "localhost", "DB_PORT": prescriptionDBPort.Port(),
"HOST": "127.0.0.1", "DB_PORT": prescriptionDBPort.Port(),
prescriptionDBHost, err := prescriptionDBContainer.ContainerIP(context.Background()) "HOST": prescriptionDBHost, "DB_PORT": prescriptionDBPort.Port(),
Die letzten 4 Beispiele hier führen alle zu einer Art TCP-Einwahlfehler, zum Beispiel:
failed to initialize database, got error failed to connect to `host=localhost user=postgres database=prescription`: dial error (dial tcp [::1]:53921: connect: cannot assign requested address)
Ich habe auch den Testcontainer debuggt und gestoppt, nachdem ich den Datenbankcontainer erstellt hatte, bin dann zu meinem Microservice gegangen und habe eine Verbindung zum Container mit DB_HOST=localhost und port= fest codiert und es hat funktioniert, sodass ich wirklich nicht weiß, was los ist. Etwas stimmt nicht . Das Einzige, was mir einfällt, ist, dass der Microservice-Container nicht mit dem Netzwerk verbunden ist, bevor versucht wird, eine Verbindung zur Datenbank herzustellen? Ich habe eine Docker-Netzwerkprüfung durchgeführt und kann sehen, dass der Datenbankcontainer angehängt ist, der Microservice jedoch nie angehängt wird (aber vielleicht hat das nur andere Gründe?).
Lösung
Sie können dies tun:
prescriptionDBContainer, err := testcontainers.GenericContainer(context.Background(), testcontainers.GenericContainerRequest{ ContainerRequest: testcontainers.ContainerRequest{ Image: "postgres", ExposedPorts: []string{"5432/tcp"}, Env: map[string]string{ "POSTGRES_USER": "postgres", "POSTGRES_PASSWORD": "password", "POSTGRES_DB": "prescription", }, Networks: []string{networkName}, NetworkAliases: map[string][]string{networkName: []string{"postgres"}}, WaitingFor: wait.ForAll( wait.ForLog("database system is ready to accept connections"), wait.ForListeningPort("5432/tcp"), ), }, Started: true, }) if err != nil { t.Fatal(err) } prescriptionContainer, err := testcontainers.GenericContainer(context.Background(), testcontainers.GenericContainerRequest{ ContainerRequest: testcontainers.ContainerRequest{ FromDockerfile: testcontainers.FromDockerfile{Context: "./testapp"}, ExposedPorts: []string{"8080/tcp"}, Networks: []string{networkName}, NetworkAliases: map[string][]string{networkName: []string{"blah"}}, Env: map[string]string{ "DATABASE_URL": "postgres://postgres:password@postgres:5432/prescription", }, WaitingFor: wait.ForListeningPort("8080/tcp"), }, Started: true, })
AchtungNetworkAliases
的配置方式;在您的代码中,您将两者都设置为 db-network
但是,我想,这是由于误解。该设置配置了一个可以引用容器的别名(在本例中,我使用 postgres
作为 postgres 容器;这意味着当连接 HOST
时,根据上面示例中使用的 URL,postgres
将是 postgres
).
Alternativ können Sie auch den port, err :=处方DBContainer.MappedPort(context.Background(), "5432/tcp")
获取主机上公开的端口,然后连接到端口上的 host.docker.internal
port.Port()
.当被测试的应用程序在主机上而不是在容器中运行时,经常使用此方法(但在这种情况下,您将连接到 localhost
并使用从 MappedPort()
Retourenbericht nutzen.
Das obige ist der detaillierte Inhalt vonGolang-Testcontainer, das Netzwerk funktioniert nicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Dieser Artikel erläutert die Paketimportmechanismen von Go: benannte Importe (z. B. importieren & quot; fmt & quot;) und leere Importe (z. B. Import _ & quot; fmt & quot;). Benannte Importe machen Paketinhalte zugänglich, während leere Importe nur T ausführen

In diesem Artikel werden die Newflash () -Funktion von BeEGO für die Übertragung zwischen PAGE in Webanwendungen erläutert. Es konzentriert sich auf die Verwendung von Newflash (), um temporäre Nachrichten (Erfolg, Fehler, Warnung) zwischen den Controllern anzuzeigen und den Sitzungsmechanismus zu nutzen. Limita

Dieser Artikel beschreibt die effiziente Konvertierung von MySQL -Abfrageergebnissen in GO -Strukturscheiben. Es wird unter Verwendung der SCAN -Methode von Datenbank/SQL zur optimalen Leistung hervorgehoben, wobei die manuelle Parsen vermieden wird. Best Practices für die Struktur -Feldzuordnung mithilfe von DB -Tags und Robus

Dieser Artikel zeigt, dass Mocks und Stubs in GO für Unit -Tests erstellen. Es betont die Verwendung von Schnittstellen, liefert Beispiele für Mock -Implementierungen und diskutiert Best Practices wie die Fokussierung von Mocks und die Verwendung von Assertion -Bibliotheken. Die Articl

In diesem Artikel werden die benutzerdefinierten Typ -Einschränkungen von GO für Generika untersucht. Es wird beschrieben, wie Schnittstellen die minimalen Typanforderungen für generische Funktionen definieren und die Sicherheitstypsicherheit und die Wiederverwendbarkeit von Code verbessern. Der Artikel erörtert auch Einschränkungen und Best Practices

Dieser Artikel beschreibt effizientes Dateischreiben in Go und vergleicht OS.WriteFile (geeignet für kleine Dateien) mit OS.openfile und gepufferter Schreibvorgänge (optimal für große Dateien). Es betont eine robuste Fehlerbehandlung, die Verwendung von Aufschub und Überprüfung auf bestimmte Fehler.

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

In diesem Artikel wird die Verwendung von Tracing -Tools zur Analyse von GO -Anwendungsausführungsfluss untersucht. Es werden manuelle und automatische Instrumentierungstechniken, den Vergleich von Tools wie Jaeger, Zipkin und Opentelemetrie erörtert und die effektive Datenvisualisierung hervorheben
