2

我正在尝试实现一个 Dockerfile 来包含我的 go 二进制文件和 chromedp。我设法构建了映像,并且可以运行映像,并且 go 二进制文件按预期运行,除了 chromedp。

提前致谢!

我收到的错误消息:
Error exec: "google-chrome": executable file not found in $PATH running chromedp

Dockerfile

# syntax=docker/dockerfile:1


##
## Build
##
FROM golang:1.17-bullseye as build

WORKDIR /app
COPY . ./

RUN go mod download

COPY *.go ./

RUN go build -o /docker-scraper

EXPOSE 8080

FROM chromedp/headless-shell:latest

CMD ["/docker-scraper"]

##
## Deploy
##
FROM gcr.io/distroless/base-debian11

WORKDIR /

COPY --from=build /docker-scraper /docker-scraper

EXPOSE 8080

USER nonroot:nonroot

ENTRYPOINT ["/docker-scraper"]
4

1 回答 1

2

错误执行:“google-chrome”:在运行 chromedp 的 $PATH 中找不到可执行文件

这是因为你没有在chromedp/headless-shell. 您定义multi-stage builds,但是这样,只有最后一个阶段将作为最终图像的基础图像。

这意味着你的 go 程序实际上是在运行的gcr.io/distroless/base-debian11,而不是headless-shell.

要了解如何运行自己的程序headless-shell,可以参考它的官方文档

当使用 chromedp/headless-shell 作为基础镜像构建运行自己程序的镜像时,您可能会遇到僵尸进程问题。要获取僵尸进程,请在 Dockerfile 的 ENTRYPOINT 上使用dumb-init 或 tini

FROM chromedp/headless-shell:latest
...
# Install dumb-init or tini
RUN apt install dumb-init
# or RUN apt install tini
...
ENTRYPOINT ["dumb-init", "--"]
# or ENTRYPOINT ["tini", "--"]
CMD ["/path/to/your/program"]

接下来是一个最小的可行示例。

main.go:

package main

import (
        "context"
        "log"
        "fmt"
        "time"

        "github.com/chromedp/chromedp"
)

func main() {
        ctx, cancel := chromedp.NewContext(
                context.Background(),
                chromedp.WithLogf(log.Printf),
        )
        defer cancel()

        ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
        defer cancel()

        err := chromedp.Run(ctx,
                chromedp.Navigate(`https://golang.org/pkg/time/`),
        )
        if err != nil {
            fmt.Println(err)
        }
        fmt.Println("done")
}

Dockerfile:

FROM golang:latest as build

WORKDIR /go/src/app
COPY ./main.go .
RUN go mod init docker-scraper; go mod tidy
RUN go build

FROM chromedp/headless-shell:latest
RUN apt-get update; apt install dumb-init -y
ENTRYPOINT ["dumb-init", "--"]
COPY --from=build /go/src/app/docker-scraper /tmp
CMD ["/tmp/docker-scraper"]

码头工人-compose.yaml:

version: '3'
services:
  goservice:
    build: .

执行:

$ docker-compose up
Recreating chromedp-docker_goservice_1 ... done
Attaching to chromedp-docker_goservice_1
goservice_1  | done
chromedp-docker_goservice_1 exited with code 0

您现在看不到任何错误google-chrome

于 2021-12-02T02:13:35.413 回答