Сборка 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 шт):
У вас проблема во второй строке (команде 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-ом, и потом копировать в итоговый образ.