Dalam pembangunan perisian moden, Docker telah menjadi alat yang sangat diperlukan, yang boleh membantu pembangun membina, menggunakan dan mengurus aplikasi dengan cepat. Sebagai bahasa pengaturcaraan yang cekap dan ringkas, Golang juga digemari oleh pembangun. Jadi, bagaimana untuk membangunkan aplikasi menggunakan Golang di Docker? Artikel ini akan memperkenalkan cara menulis Dockerfile untuk aplikasi Golang dan menggunakan perpustakaan chromedp untuk melaksanakan ujian web automatik. Jika anda berminat dengan ujian automatik Golang, Docker dan Web, anda mungkin ingin terus membaca.
Saya mempunyai kod golang yang menggunakan chromedp untuk menyambung ke krom tempatan pengguna Ini kod saya:
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) }
Jadi saya membuat fail docker dengan apa yang pelanggan saya perlukan untuk menggunakan aplikasi ini (saya memasang chrome dan membina golang saya dalam imej)
fail buruh pelabuhan:
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"]
Imej dibina dengan jayanya dan tanpa sakit kepala Tetapi apabila menguji imej docker secara tempatan, saya mendapat ralat ini:
Error: exec: "google-chrome": executable file not found in $PATH
Apakah maksud ralat ini? Chrome saya tidak berjalan? Bagaimana saya boleh menjalankannya?
Pelayar Chrome hanya dipasang dan tidak tersedia dalam imej akhir yang dibuat build-stage
中。它在 build-release-stage
.
Saya cuba memasang chrome menggunakan fail docker ini:
# 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 &
Tetapi ia gagal dengan mesej berikut:
... 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
Saya rasa anda perlu memilih imej asas lain di mana anda boleh memasang krom dengan mudah. Pilihan yang lebih baik ialah menjalankan ujian menggunakan imej chromedp/headless-shell
作为基础镜像。该图像包含 chrome 的无头 shell,该 shell 非常小。下面的演示 dockerfile 还显示了首先编译测试二进制文件,然后在 chromedp/headless-shell
:
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"]
Atas ialah kandungan terperinci Golang chromedp dockerfile. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!