dart-lang / dart-docker

Docker images for the Dart programming language (https://dart.dev)
BSD 3-Clause "New" or "Revised" License
67 stars 15 forks source link

Sqlite3 #171

Closed wolframm closed 2 months ago

wolframm commented 9 months ago

What would be the best way to include Sqlite3 into the image so that it can be used by packages such as https://pub.dev/packages/drift?

cpswan commented 9 months ago

A few assumptions:

The Dart image doesn't have Sqlite3 there by default. So the library needs to be installed. It's that library that will then be used via dart:ffi for packages like drift or sqlite3.

RUN set -eux; \
    apt-get update; \
    apt-get install -y --no-install-recommends libsqlite3-0

The library then needs to be copied into /runtime so that it's there with the other libraries that are needed for an AOT binary to dynamically link to:

RUN set -eux; \
    case "$(dpkg --print-architecture)" in \
        amd64) \
            TRIPLET="x86_64-linux-gnu" ;; \
        armhf) \
            TRIPLET="arm-linux-gnueabihf" ;; \
        arm64) \
            TRIPLET="aarch64-linux-gnu" ;; \
        *) \
            echo "Unsupported architecture" ; \
            exit 5;; \
    esac; \
    FILES="/lib/$TRIPLET/libsqlite3.so.0"; \
    for f in $FILES; do \
        dir=$(dirname "$f"); \
        mkdir -p "/runtime$dir"; \
        cp --archive --link --dereference --no-target-directory "$f" "/runtime$f"; \
    done

The section above copies liberally from the Dockerfile-debian.template in this repo, which is designed for multiple architectures. If you know your target architecture is fixed then things can be simplified quite a bit by simply copying the single libsqlite3.so.0 shared library file.

The second stage of the Dockerfile then proceeds as normal, copying in the /runtime, which will now have the sqlite3 library along with libc and the other AOT dependencies:

FROM scratch
COPY --from=build /runtime/ /

NB I've not tested this, so please excuse any typos. I'm pretty sure that the libraries libsqlite3-0.so.0 links to are already present in runtime:

ldd /lib/x86_64-linux-gnu/libsqlite3.so.0

        linux-vdso.so.1 (0x00007ffdb45f1000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa502bd1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa5029f0000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa502e13000)

linux-vdso.so.1 is a virtual shared object rather than a library file on disk.