我们如何使用 dpkg 在 dockerfile 中的 alpine 图像上安装 google-chrome-stable?

Posted

技术标签:

【中文标题】我们如何使用 dpkg 在 dockerfile 中的 alpine 图像上安装 google-chrome-stable?【英文标题】:How can we install google-chrome-stable on alpine image in dockerfile using dpkg? 【发布时间】:2020-02-27 11:03:04 【问题描述】:

我正在尝试使用 dpkg 在 alpine 图像上安装 google-chrome-stable。但是,dpkg 已安装但它没有安装 google-chrome-stable 而是返回此错误?有没有办法使用 dpkg 或其他方式在 alpine 映像中安装 google-chrome-stable?

dpkg: regarding google-chrome-stable_current_amd64.deb containing 

google-chrome-stable:amd64, pre-dependency problem:
 google-chrome-stable:amd64 pre-depends on dpkg (>= 1.14.0)

dpkg: error processing archive google-chrome-stable_current_amd64.deb (--install):
 pre-dependency problem - not installing google-chrome-stable:amd64
Errors were encountered while processing:

Dockerfile:

# Base image
FROM ruby:2.6.3-alpine3.10
# Use node version 10.16.3, yarn version 1.16.0
RUN apk add  --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.10/main/ nodejs=10.16.3-r0
RUN apk add  --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/v3.10/community/ yarn=1.16.0-r0

# Install dependencies
RUN apk upgrade
RUN apk --update \
    add build-base \
    git \
    tzdata \
    nodejs \
    nodejs-npm \
    bash \
    curl \
    yarn \
    gzip \
    postgresql-client \
    postgresql-dev \
    imagemagick \
    imagemagick-dev \
    imagemagick-libs \
    chromium \
    chromium-chromedriver \
    ncurses \
    less \
    dpkg=1.19.7-r0 \
    chromium \
    chromium-chromedriver

RUN dpkg --add-architecture amd64
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb

# This is the base directory used in any
# further COPY, RUN and ENTRYPOINT commands
WORKDIR /webapp
# Copy Gemfile and Gemfile.lock and run bundle install
COPY Gemfile* /webapp/
RUN gem install bundler -v '1.17.3' && \
    bundle _1.17.3_ install

# Copy everything to /webapp for docker image
COPY . ./

EXPOSE 3000

# Run the application
CMD ["rails", "server", "-b", "0.0.0.0"]

【问题讨论】:

【参考方案1】:

以这种方式安装 Chrome .deb 文件在 Alpine 上不起作用。

虽然 dpkg 软件包在 Alpine 存储库中可用,并且对于安装轻量级 Debian 软件包很有用,但您将无法使用它来安装复杂的 Debian 软件包,因为它无法满足许多 Debian依赖关系。 Alpine 通常不兼容 Debian(依赖于musl libc),因此使用 apk 安装原生 Alpine 包是正确的方法。

AFAIK,目前没有与 Google Chrome Alpine Linux 兼容的 musl-libc 版本。

但是,您可以安装 Chromium 浏览器,该浏览器可使用 apk 软件包获得:

apk add chromium

另一个选项是在原版 Alpine 映像上启用 glibc,使其与 Debian 二进制文件兼容。这是一个相当简单的过程,请参阅:Dockerfile。但是,它可能不适用于具有现有应用程序的图像,例如ruby:2.6.3-alpine3.10。此外,即使在 Alpine 上安装了 glibc,Chrome 也不太可能毫无问题地运行。我进行了快速尝试 (Dockerfile),但无法通过第一个 segfault。

编辑 9/5/21:至少可以说,在 Alpine 上运行与 debian 兼容的 Chrome 稳定版将是一项非常困难的任务。这部分是由于大量的依赖项和库。在动态链接期间尝试运行它会导致段错误,最后是来自动态链接器的断言。即使我们设法解决了这些问题并启动 Chrome,它也可能非常不稳定。

【讨论】:

如何获得稳定版的 chromium? 如果不是 Chrome,有什么方法可以获取 Chromium 的更新版本? Alpine 的软件包已过期。 谢谢@Brad!最好的办法是从源代码构建 Chromium,依赖于 APKBUILD 和 package build log。这也涉及大量工作。我希望尽快尝试一下。 @Brad 最新 Chromium on Alpine 的另一个选择是试图获取预先构建的静态链接 Chromium 二进制文件。这样的二进制文件应该与任何 Linux 兼容,因为它不应该携带动态依赖项。我已经搜索过这样一个静态/整体的 Chromium 二进制文件,但到目前为止还没有运气。理论上,这样的二进制文件可以在 Ubuntu 上构建,这可能得到更好的支持,然后在 Alpine 上运行。 @valiano 这是我尝试的第一件事,但不幸的是,二进制文件的架构类型与我在 Alpine 下可以使用的架构类型不匹配,因此无法执行。你知道解决方法吗?【参考方案2】:

由于chromium-chromedriver出现在你的包列表中,我想你想做browser automation。至于browser automation,我使用javaselenium,并下载chromium二进制和@987654328手动@二进制。

我最想告诉你的是,chromium 二进制和chromium driver 二进制包可能无法按预期工作,您需要降级 chrome 驱动程序或 chrome 的版本并进行多次尝试以找到无论您使用的是 node.js 还是 java selenium,匹配的版本都可以真正工作。

使用Selenium,您还有另一种选择,您可以将 chrome 和 chromedriver 捆绑包部署为不同服务器中的 http 服务,并让 selenium 调用远程 chrome 服务。

ChromeDriver 用于版本 93.0.4577.15

【讨论】:

与问题无关。作者希望 chrome 专门用于 alpine 图像,而不是其他环境。

以上是关于我们如何使用 dpkg 在 dockerfile 中的 alpine 图像上安装 google-chrome-stable?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ubuntu中使用dpkg命令卸载软件

在debain中用sudo dpkg -i方式安装chrome,安装完成后点击无反应,请问要如何解

Docker安装部署(镜像构建)-执行Dockerfile

如何使用 Dockerfile自定义镜像?

RPM 与 DPKG 使用

RPM 与 DPKG 使用