In der modernen Softwareentwicklung ist Docker zu einem unverzichtbaren Werkzeug geworden, das Entwicklern dabei helfen kann, Anwendungen schnell zu erstellen, bereitzustellen und zu verwalten. Als effiziente und prägnante Programmiersprache wird Golang auch von Entwicklern bevorzugt. Wie entwickelt man also Anwendungen mit Golang in Docker? In diesem Artikel wird erläutert, wie Sie eine Docker-Datei für eine Golang-Anwendung schreiben und die chromedp-Bibliothek verwenden, um automatisierte Webtests zu implementieren. Wenn Sie sich für automatisierte Golang-, Docker- und Web-Tests interessieren, möchten Sie vielleicht weiterlesen.
Ich habe einen Golang-Code, der chromedp verwendet, um eine Verbindung zum lokalen Chrome des Benutzers herzustellen Das ist mein Code:
package main import ( "context" "fmt" "log" "os" "time" "github.com/chromedp/chromedp" "github.com/gin-gonic/gin" ) func main() { api := gin.default() api.get("api/jwt", func(c *gin.context) { opts := append(chromedp.defaultexecallocatoroptions[:], chromedp.flag("headless", false), chromedp.flag("disable-gpu", true), chromedp.flag("no-sandbox", true), chromedp.flag("disable-dev-shm-usage", true), chromedp.flag("disable-browser-side-navigation", true), chromedp.flag("disable-infobars", true), chromedp.flag("disable-extensions", true), chromedp.flag("disable-notifications", true), chromedp.flag("disable-default-apps", true), chromedp.flag("disable-background-timer-throttling", true), chromedp.flag("disable-backgrounding-occluded-windows", true), chromedp.flag("disable-renderer-backgrounding", true), ) allocctx, cancel := chromedp.newexecallocator(context.background(), opts...) defer cancel() ctx, cancel := chromedp.newcontext(allocctx) defer cancel() var localstoragedata string // declaração da variável localstoragedata err := chromedp.run(ctx, chromedp.navigate("https://csonlinetenant.b2clogin.com/csonlinetenant.onmicrosoft.com/oauth2/v2.0/authorize"), chromedp.sleep(5*time.second), chromedp.waitvisible(`#fgh`), chromedp.sendkeys(`#fghfg`, "fghfgh"), chromedp.sendkeys(`#xcvxcv`, "xcxcvcxv"), chromedp.click(`#thgh`, chromedp.byid), chromedp.sleep(5*time.second), chromedp.click(`dfgd`, chromedp.byid), chromedp.sleep(15*time.second), chromedp.evaluateasdevtools(`localstorage.getitem('c')`, &localstoragedata), ) if err != nil { log.printf("error: %v", err) return } fmt.println("bearer", localstoragedata) // restante do código... c.json(200, gin.h{ "success": localstoragedata, }) }) listenaddr := os.getenv("listen") if val, ok := os.lookupenv("functions_customhandler_port"); ok { listenaddr = ":" + val } if listenaddr == "" { listenaddr = ":8080" } api.run(listenaddr) }
Also habe ich eine Docker-Datei mit dem erstellt, was mein Kunde braucht, um diese App zu verwenden (ich habe Chrome installiert und mein Golang in das Image eingebaut)
Docker-Datei:
from golang:1.20 as build-stage workdir /app # instale as dependências do chrome run wget -q -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list run apt-get update && apt-get -y install google-chrome-stable run chrome & copy go.mod go.sum ./ run go mod download copy *.go ./ run cgo_enabled=0 goos=linux go build -o /dockergo # run the tests in the container from build-stage as run-test-stage run go test -v ./... # deploy the application binary into a lean image from gcr.io/distroless/base-debian11 as build-release-stage workdir / copy --from=build-stage /dockergo /dockergo expose 8080 user nonroot:nonroot entrypoint ["/dockergo"]
Image erfolgreich und ohne Kopfschmerzen erstellt Aber wenn ich das Docker-Image lokal teste, erhalte ich diese Fehlermeldung:
Error: exec: "google-chrome": executable file not found in $PATH
Was bedeutet dieser Fehler? Mein Chrome läuft nicht? Wie kann ich es ausführen?
Der Chrome-Browser wird nur installiert und ist im endgültig erstellten Image nicht verfügbar build-stage
中。它在 build-release-stage
.
Ich versuche Chrome mit dieser Docker-Datei zu installieren:
# deploy the application binary into a lean image from gcr.io/distroless/base-debian11 as build-release-stage run wget -q -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \ && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list run apt-get update && apt-get -y install google-chrome-stable run chrome &
Aber es schlägt mit der folgenden Meldung fehl:
... step 2/4 : run wget -q -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list ---> running in 7596202a5684 failed to create shim task: oci runtime create failed: runc create failed: unable to start container process: exec: "/bin/sh": stat /bin/sh: no such file or directory: unknown
Ich denke, Sie müssen ein anderes Basisimage auswählen, auf dem Sie Chrome problemlos installieren können. Eine bessere Option besteht darin, die Tests mit dem chromedp/headless-shell
作为基础镜像。该图像包含 chrome 的无头 shell,该 shell 非常小。下面的演示 dockerfile 还显示了首先编译测试二进制文件,然后在 chromedp/headless-shell
-Bild auszuführen:
FROM golang:1.20.5-buster AS build-stage WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED=0 go build -o dockergo # Build the test binary RUN CGO_ENABLED=0 go test -c -o dockergo.test # Run the tests in the container FROM chromedp/headless-shell:114.0.5735.199 AS run-test-stage WORKDIR /app # Copy other files that is needed to run the test (testdata?). COPY . . COPY --from=build-stage /app/dockergo.test ./dockergo.test RUN /app/dockergo.test -test.v # Deploy the application binary into a lean image FROM chromedp/headless-shell:114.0.5735.199 AS build-release-stage COPY --from=build-stage /app/dockergo /dockergo EXPOSE 8080 ENTRYPOINT ["/dockergo"]
Das obige ist der detaillierte Inhalt vonGolang chromedp Docker-Datei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!