Сборка TDLib в Докер контейнере

Пытаюсь разобраться с TDLib используя .Net Core. Вот тут нашел единственный вариант для C#. Первым пунктом вышеупомянутого руководства есть получение скомпилированной библиотеки. В официанной документации телеграма есть ссылка на автогенератор скрипта для компиляции вышеупомянутой библиотеки. На основании этого скрипта я написал свой докерфайл, который выглядит вот так (по сути докерфайл был автоматически сгенерирован студией я лишь добавил в него инструкции RUN)

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
RUN su - && \
    apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y make git zlib1g-dev libssl-dev gperf php cmake clang libc++-dev libc++abi-dev && \
    exit && \
    git clone https://github.com/tdlib/td.git && \
    cd td && \
    rm -rf build && \
    mkdir build && \
    cd build && \
    export CXXFLAGS="-stdlib=libc++" && \
    CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=/usr/local .. && \
    cmake --build . --target prepare_cross_compiling && \
    cd .. && \
    php SplitSource.php && \
    cd build && \
    cmake --build . --target install && \
    cd .. && \
    php SplitSource.php --undo && \
    cd .. && \
    ls -l /usr/local
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["TD_Lib_Builder/TD_Lib_Builder.csproj", "TD_Lib_Builder/"]
RUN dotnet restore "TD_Lib_Builder/TD_Lib_Builder.csproj"
COPY . .
WORKDIR "/src/TD_Lib_Builder"
RUN dotnet build "TD_Lib_Builder.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "TD_Lib_Builder.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "TD_Lib_Builder.dll"]

Данный контейнер запускается успешно и без ошибок, но вот я в нем не нахожу ни директории ни скомпилированных файлов.

Помогите разобраться с данной проблемой.


Ответы (1 шт):

Автор решения: Exploding Kitten

У вас проблема во второй строке (команде RUN), вам не нужна команда su - (вы и так под root), а exit просто прерывает выполнение скрипта, должно быть примерно так:

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y make git zlib1g-dev libssl-dev gperf php cmake clang libc++-dev libc++abi-dev && \
    git clone https://github.com/tdlib/td.git && \
    cd td && \
    rm -rf build && \
    mkdir build && \
    cd build && \
    export CXXFLAGS="-stdlib=libc++" && \
    CC=/usr/bin/clang CXX=/usr/bin/clang++ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=/usr/local .. && \
    cmake --build . --target prepare_cross_compiling && \
    cd .. && \
    php SplitSource.php && \
    cd build && \
    cmake --build . --target install && \
    cd .. && \
    php SplitSource.php --undo && \
    cd .. && \
    ls -l /usr/local

После этого библиотека должна находиться в /usr/local/lib/:

libtdactor.a
libtdapi.a
libtdclient.a
libtdcore.a
libtddb.a
libtdjson.so
libtdjson.so.1.6.8
libtdjson_private.a
libtdjson_static.a
libtdnet.a
libtdsqlite.a
libtdutils.a

Также вы устанавливаете все зависимости для билда в образ, который будет использоваться для запуска (что увеличивает его размер), если вы уже используете multi-stage build, то лучше будет собирать библиотеку отдельным stage-ом, и потом копировать в итоговый образ.

→ Ссылка