Go 和 chromedp 的 Dockerfile
Dockerfile for Go and chromedp
我正在尝试实现一个 Dockerfile 以包含我的 go 二进制文件和 chromedp。我设法构建了图像,我可以 运行 图像和 go 二进制文件 运行s,除了 chromedp。
提前致谢!
我收到的错误消息:
Error exec: "google-chrome": executable file not found in $PATH running chromedp
Docker 文件
# 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"]
Error exec: "google-chrome": executable file not found in $PATH running chromedp
这是因为你在chromedp/headless-shell
中没有运行你的围棋程序。你定义了multi-stage builds
,但是有了这个,只有最后一个阶段会作为最终图像的基础图像。
这意味着您的 go 程序实际上 运行 在 gcr.io/distroless/base-debian11
中,而不是 headless-shell
。
要了解如何在 headless-shell
中 运行 您自己的程序,您可以参考其 official document:
When using chromedp/headless-shell as a base image to build an image that runs your own program, You could experience zombie process problem. To reap zombie processeses, use dumb-init or tini on your Dockerfile's ENTRYPOINT
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"]
docker-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
的任何错误。
我正在尝试实现一个 Dockerfile 以包含我的 go 二进制文件和 chromedp。我设法构建了图像,我可以 运行 图像和 go 二进制文件 运行s,除了 chromedp。
提前致谢!
我收到的错误消息:
Error exec: "google-chrome": executable file not found in $PATH running chromedp
Docker 文件
# 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"]
Error exec: "google-chrome": executable file not found in $PATH running chromedp
这是因为你在chromedp/headless-shell
中没有运行你的围棋程序。你定义了multi-stage builds
,但是有了这个,只有最后一个阶段会作为最终图像的基础图像。
这意味着您的 go 程序实际上 运行 在 gcr.io/distroless/base-debian11
中,而不是 headless-shell
。
要了解如何在 headless-shell
中 运行 您自己的程序,您可以参考其 official document:
When using chromedp/headless-shell as a base image to build an image that runs your own program, You could experience zombie process problem. To reap zombie processeses, use dumb-init or tini on your Dockerfile's ENTRYPOINT
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"]
docker-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
的任何错误。