Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Running geckodriver in an Alpine docker container

I'm trying to run GeckoDriver v0.26.0 inside an Alpine 3.10 docker container, specifically python:3.6.6-alpine3.10.

After figuring some things out, I've hit a wall:

/ # geckodriver --version
Error relocating /usr/bin/geckodriver: __register_atfork: symbol not found
Error relocating /usr/bin/geckodriver: __res_init: symbol not found

What am I missing?

How I got here

First spin up the docker container:

docker run -it python:3.6.9-alpine3.10 /bin/sh

Then try installing GeckoDriver

/ # wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
/ # tar -zxf geckodriver-v0.26.0-linux64.tar.gz -C /usr/bin
/ # geckodriver --version
/bin/sh: geckodriver: not found.

Really? but I just extracted it... Hmm... OK. Did it extract correctly? Is $PATH correct?

/ # ls -lah /usr/bin/geckodriver
-rwxr-xr-x    1 1000     1000        6.7M Oct 12 10:19 /usr/bin/geckodriver
/ # echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Yes. OK, Let's google things. Well perhaps I should check the file info. Alpine doesn't have that by default.

/ # apk add file
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/2) Installing libmagic (5.37-r1)
(2/2) Installing file (5.37-r1)
Executing busybox-1.30.1-r2.trigger
OK: 24 MiB in 36 packages
/ # file /usr/bin/geckodriver
/usr/bin/geckodriver: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.26, BuildID[sha1]=32c4cfc2d9346336dc7c20e99a62df9be344d609, with debug_info, not stripped

The answer to that same question says to check for /lib64/ld-linux-x86-64.so.2:

/ # ls /lib64
ls: /lib64: No such file or directory

Missing. OK, how do we get that? The Alpine package repo says it's part of libc6-compat. Cool install that and things will work... right?

/ # apk add libc6-compat
(1/1) Installing libc6-compat (1.1.22-r3)
OK: 24 MiB in 37 packages
/ # ls /lib64
ld-linux-x86-64.so.2
/ # geckodriver --version
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /usr/bin/geckodriver)
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /usr/bin/geckodriver)
Error relocating /usr/bin/geckodriver: __register_atfork: symbol not found
Error relocating /usr/bin/geckodriver: _Unwind_Resume: symbol not found
Error relocating /usr/bin/geckodriver: __res_init: symbol not found
Error relocating /usr/bin/geckodriver: _Unwind_GetIP: symbol not found
Error relocating /usr/bin/geckodriver: _Unwind_Backtrace: symbol not found

... Well at least it recognizes it as an executable file now... OK, so we need libgcc_s.so.1. That's in libgcc. Makes sense.

/ # apk add libgcc
(1/1) Installing libgcc (8.3.0-r0)
OK: 24 MiB in 38 packages
/ # geckodriver --version
Error loading shared library ld-linux-x86-64.so.2: No such file or directory (needed by /usr/bin/geckodriver)
Error relocating /usr/bin/geckodriver: __register_atfork: symbol not found
Error relocating /usr/bin/geckodriver: __res_init: symbol not found

What? We have ld-linux-x86-64.so.2 in /lib64, where's it looking? I did notice that the gcompat package as /lib/ld-linux-x86-64.so.2, maybe it's looking there?

# / apk add gcompat
(1/2) Installing libucontext (0.1.3-r1)
(2/2) Installing gcompat (0.4.0-r0)
OK: 24 MiB in 40 packages
# / geckodriver --version
Error relocating /usr/bin/geckodriver: __register_atfork: symbol not found
Error relocating /usr/bin/geckodriver: __res_init: symbol not found

And that's where I'm at. Googling for __register_atfork and __res_init don't return anything useful.

like image 229
dthor Avatar asked Nov 06 '19 21:11

dthor


People also ask

How do I SSH into an Alpine Docker container?

Run built container using docker run -p 7655:22 <container_id> . In a different terminal instance run ssh root@localhost -p 7655 . Voila - you successfully SSHed into a Docker Container. Using SSH for your production app would be the same except you would be using its IP instead of localhost and a valid port.

Is Alpine Linux good for Docker?

Alpine Linux is a super lightweight Linux distribution that's useful for Docker containers.

Does Alpine image have Docker?

What is the Alpine Docker Official Image? The Alpine DOI is a building block for Alpine Linux Docker containers. It's an executable software package that tells Docker and your application how to behave. The image includes source code, libraries, tools, and other core dependencies that your application needs.


1 Answers

So the root cause of the issue appears to be that Alpine uses musl libc and GeckoDriver (indirectly) uses glibc.

SGerrand has a great glibc compatibility layer package for Alpine Linux which we'll make use of.

To get GeckoDriver running on Alpine:

# Get all the prereqs
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-2.30-r0.apk
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-bin-2.30-r0.apk
apk add glibc-2.30-r0.apk
apk add glibc-bin-2.30-r0.apk

# And of course we need Firefox if we actually want to *use* GeckoDriver
apk add firefox-esr=60.9.0-r0

# Then install GeckoDriver
wget https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
tar -zxf geckodriver-v0.26.0-linux64.tar.gz -C /usr/bin
geckodriver --version

Caveats:

  • Only tested on the python:3.6.9-alpine3.10 docker image.
  • Alpine 3.10 only has Firefox ESR 60. Luckily GeckoDriver v0.26 has a minimum version of FireFox 60.
    • The Alpine Edge branch has Firefox-ESR 86 and Firefox 70.
like image 82
dthor Avatar answered Sep 18 '22 17:09

dthor