如何在docker中运行chromedp

2024-02-13

我正在尝试跑步chromedp https://github.com/chromedp/chromedp在码头工人。 我的main.go https://github.com/ypapax/chromedp_docker/blob/master/main.go:

package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/chromedp"
)

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

    // create a timeout
    ctx, cancel = context.WithTimeout(ctx, 15 * time.Second)
    defer cancel()

    u := `https://www.whatismybrowser.com/detect/what-is-my-user-agent`
    selector := `#detected_value`
    log.Println("requesting", u)
    log.Println("selector", selector)
    var result string
    err := chromedp.Run(ctx,
        chromedp.Navigate(u),
        chromedp.WaitReady(selector),
        chromedp.OuterHTML(selector, &result),
    )
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("result:\n%s", result)
}

Dockerfile:

FROM golang:latest as build-env
RUN mkdir $GOPATH/src/app
WORKDIR $GOPATH/src/app
ENV GO111MODULE=on
COPY go.mod .
COPY go.sum .
COPY main.go .
RUN go mod download
RUN go build -o /root/app

FROM chromedp/headless-shell
COPY --from=build-env /root/app /
CMD ["/app"]

当我运行它时:

docker-compose build
docker-compose up

它输出:

app_1  | [1129/192523.576726:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | [1129/192523.602779:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | 
app_1  | DevTools listening on ws://0.0.0.0:9222/devtools/browser/3fa247e0-e2fa-484e-8b5f-172b392701bb
app_1  | [1129/192523.836854:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | [1129/192523.838804:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | [1129/192523.845866:ERROR:egl_util.cc(60)] Failed to load GLES library: /headless-shell/swiftshader/libGLESv2.so: /headless-shell/swiftshader/libGLESv2.so: cannot open shared object file: No such file or directory
app_1  | [1129/192523.871796:ERROR:viz_main_impl.cc(176)] Exiting GPU process due to errors during initialization
app_1  | [1129/192523.897083:WARNING:gpu_process_host.cc(1220)] The GPU process has crashed 1 time(s)
app_1  | [1129/192523.926741:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | [1129/192523.930111:ERROR:egl_util.cc(60)] Failed to load GLES library: /headless-shell/swiftshader/libGLESv2.so: /headless-shell/swiftshader/libGLESv2.so: cannot open shared object file: No such file or directory
app_1  | [1129/192523.943794:ERROR:viz_main_impl.cc(176)] Exiting GPU process due to errors during initialization
app_1  | [1129/192523.948757:WARNING:gpu_process_host.cc(1220)] The GPU process has crashed 2 time(s)
app_1  | [1129/192523.950107:ERROR:browser_gpu_channel_host_factory.cc(138)] Failed to launch GPU process.
app_1  | [1129/192524.013014:ERROR:browser_gpu_channel_host_factory.cc(138)] Failed to launch GPU process.

所以它不运行我的 go 应用程序。我预计chromedp/headless-shell包含 google-chrome,我的 golang 应用程序将成功使用它github.com/chromedp/chromedp https://github.com/chromedp/chromedp

Update 1

I added https://github.com/ypapax/chromedp_docker/commit/9090630014ab408ab80624be2ea66127ce3b6312#diff-3254677a7917c6c01f55212f86c57fbfR13缺少目录:

RUN mkdir -p /headless-shell/swiftshader/ \
    && cd /headless-shell/swiftshader/ \
    && ln -s ../libEGL.so libEGL.so \
    && ln -s ../libGLESv2.so libGLESv2.so

现在有以下输出,我的应用程序仍然没有运行:

app_1  | [1202/071210.095414:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | [1202/071210.112632:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | 
app_1  | DevTools listening on ws://0.0.0.0:9222/devtools/browser/86e31db1-3a17-4da6-9e2f-696647572492
app_1  | [1202/071210.166158:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 
app_1  | [1202/071210.186307:WARNING:resource_bundle.cc(426)] locale_file_path.empty() for locale 

Update 2

好像CMD ["/app"]不运行我的 main.go 文件,因为它不打印其中的任何行。 当我手动运行它时:

$ /usr/local/bin/docker exec -ti chromedp_docker_app_1 /bin/bash

root@0c417fd159a2:/# /app
2019/12/02 07:40:34 app is running
2019/12/02 07:40:34 /go/src/app/main.go:26: requesting https://www.whatismybrowser.com/detect/what-is-my-user-agent
2019/12/02 07:40:34 /go/src/app/main.go:27: selector #detected_value
2019/12/02 07:40:34 /go/src/app/main.go:35: exec: "google-chrome": executable file not found in $PATH

我看到google-chrome应用程序仍然不存在,嗯......


您在这里遗漏了一些东西,首先您需要在容器内运行 google-headless-chrome 。您可以使用以下 Dockerfile

FROM golang:1.12.0-alpine3.9

RUN apk update && apk upgrade && apk add --no-cache bash git && apk add --no-cache chromium

# Installs latest Chromium package.
RUN echo @edge http://nl.alpinelinux.org/alpine/edge/community >> /etc/apk/repositories \
    && echo @edge http://nl.alpinelinux.org/alpine/edge/main >> /etc/apk/repositories \
    && apk add --no-cache \
    harfbuzz@edge \
    nss@edge \
    freetype@edge \
    ttf-freefont@edge \
    && rm -rf /var/cache/* \
    && mkdir /var/cache/apk

RUN go get github.com/mafredri/cdp


CMD chromium-browser --headless --disable-gpu --remote-debugging-port=9222 --disable-web-security --safebrowsing-disable-auto-update --disable-sync --disable-default-apps --hide-scrollbars --metrics-recording-only --mute-audio --no-first-run --no-sandbox

我正在使用 CDP,对我来说更强大、更有趣! 这是 CDP 的链接:https://github.com/mafredri/cdp https://github.com/mafredri/cdp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在docker中运行chromedp 的相关文章

随机推荐

  • 有没有办法在 Protractor 测试中绕过 Chrome 地理定位对话框?

    在使用量角器自动化应用程序时 我遇到了这个问题 打开主页后 我会看到带有 阻止 允许 按钮的地理位置对话框 如果不选择任一选项 该对话框就无法继续 事实证明 这个对话框不是警报的实例 这就是为什么browser switchTo alert
  • 新 Activity 的 onStart 在父 Activity 的 onStop 之前调用

    我有一份申请 我用startActivity 开始活动 谁能真正告诉我为什么系统会调用onStart 首先是新 Activity 而不是父活动onStop 这可能吗 没有系统错误 我找到了在 onStart 之后直接调用 Fragment
  • 从文件生成频率表

    给定一个每行包含一个数字的输入文件 我如何计算某个项目在该文件中出现的次数 cat input txt 1 2 1 3 1 0 期望的输出 gt 1 3 1 1 cat output txt 0 1 1 3 2 1 3 1 如果该解决方案也
  • Postgres SELECT 数组中的值

    我有一个看起来像这样的 postgres 表 缩短 id serial col1 character varying 1 Life Health VA Data 我正在尝试执行以下操作 SELECT FROM mytable WHERE L
  • 析构函数的执行顺序?

    我知道c 中的析构函数没有执行顺序 我在几个类中使用以下结构 它是为了破坏实例和静态信息 public class MyClass private static readonly Destructor DestructorObject ne
  • =importXML() 中的 xpath 用于提取元描述

    我正在尝试使用 Xpath 使用 Google Sheets 从网页中提取元描述 我正在努力提取标题 importXml www example com title 以下是我的两个学习来源 http seogadget co uk play
  • 简单 MySQL 子查询性能

    考虑 2 个 MySQL 查询 SELECT ue userid e courseid FROM SELECT id courseid FROM mdl enrol WHERE status 0 AND courseid IN 46 e I
  • 使用 ADO .NET 调用 SQL 函数

    我想要在 SQL Server 中创建调用函数 它接收两个参数并返回一个整数 当我调用存储过程时 我使用以下代码 sqlcmd CommandType CommandType StoredProcedure sqlcmd CommandTe
  • C 或 C++ 中乘法和除法的较高部分?

    当我在汇编中将一对 4 字节整数相乘时 结果的较低部分在 EAX 中 较高部分在 EDX 中 如果我使用 C 或 C 并且我想获得更高的部分 是否可以不使用内联汇编 是否可以以同样的方式从 EAX 获得整数除法结果 从 EDX 获得模数结果
  • Android NDK - 附加包含目录

    我正在使用 Android NDK 构建共享库 我包含了 Android mk 文件中的一个片段 该片段给我带来了一些问题 LOCAL PATH call my dir other module here other module here
  • 在 React Native 中使用 React Navigation 隐藏 StackNavigator 上的标头

    我有以下内容 import React from react import StyleSheet Text View Button from react native import StackNavigator from react nav
  • 专门化模板类的模板成员函数?

    我有一个模板类 它有一个需要专门化的模板成员函数 如下所示 template
  • C#:获取从表单发布的值[重复]

    这个问题在这里已经有答案了 我使用带有方法 post 的表单从另一个页面发布一些数据 我想知道的是 获取这些值的最佳方法是什么 按以下形式的每个名称 Request name 或者有什么方法可以获取数据集合并迭代它 谢谢 你可以写 fore
  • 慢速 SoapHttpClientProtocol 构造函数

    我正在使用 Microsoft Dynamics CRM 进行一些实验 您通过 Web 服务与它交互 我已将 Web 引用添加到我的项目中 Web服务接口非常丰富 生成的 Reference cs 有90k左右 我在控制台应用程序中使用网络
  • 使用 Linux 网络设备别名时指定 TCP 套接字的源 IP 地址

    对于一些特定的网络测试 我创建了一个 VLAN 设备 eth1 900 和几个别名 eth1 900 1 和 eth1 900 2 eth1 900 Link encap Ethernet HWaddr 00 18 E7 17 2F 13
  • 使用 Database.SetInitializer 避免霰弹枪手术

    The 规范答案 https stackoverflow com a 8679662 161457关于放置的地方Database SetInitializer来电处于Global asax对于网络项目 我正在寻找另一种选择 我们使用 Ent
  • 如何在 Go 中获得“虚拟主机”功能?

    使用 Nginx Django 创建虚拟主机就像编写适当的配置一样简单 对于 Go 我发现了这个https codereview appspot com 4070043 https codereview appspot com 407004
  • Beego - 端点测试

    我正在测试 beego 的 http 自定义端点 package test import github com astaxie beego github com smartystreets goconvey convey golife ap
  • 带有水平滚动条的 pre/code 元素破坏了 Firefox 上的 Flex 布局

    在我的基于弹性盒的布局中 我可能有一个 pre code code pre 元素 以及其他元素 由于它的内容可能比容器更宽 所以我做了它overflow x auto 它在 Chrome 上完美运行 但它在 Firefox 上被破坏了 在没
  • 如何在docker中运行chromedp

    我正在尝试跑步chromedp https github com chromedp chromedp在码头工人 我的main go https github com ypapax chromedp docker blob master ma