Getting the AWS X-Ray deamon to run on Alpine Linux
31 Aug 2017X-Ray is a managed distributed tracing service by Amazon Web Services. Your application (whether it’s a single API or made up of multiple distributed microservices) collects data (such as timing and metrics for business logic, SQL queries and calls to AWS services) whilst processing incoming requests and then sends this data to a local deamon over UDP which in turn forwards the data onto the X-Ray service.
I’ve been experimenting with bundling the X-Ray deamon into an Alpine Linux container alongside some other binaries however out of the box it didn’t work. Attempting to execute the xray
binary would result in a confusing error message like this:
sh: /xray: not found
After some Googling I discovered the ldd
command which is used to find the shared libraries that a binary calls.
Executing ldd xray
I get the following output:
/ # ldd xray
/lib64/ld-linux-x86-64.so.2 (0x55a247c9b000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x55a247c9b000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x55a247c9b000)
This first library that the X-Ray binary attempts to call is /lib64/ld-linux-x86-64.so.2
.
If I list the contents of /
I can see that the /lib64
directory isn’t present out of the box with Alpine:
/ # ls
bin dev etc home lib media mnt proc root run sbin srv sys tmp usr var
My understanding is that this is because Alpine Linux uses musl libc instead of GNU libc and the xray
binary is linked against GNU libc libraries.
Alpine provides a package called libc6-compat which provides compatibility libraries for glibc as well as symlinks /lib64
to /lib
. This can be installed with the command apk add libc6-compat
.
After installing libc6-compat
the X-Ray deamon now runs successfully.