Я пытаюсь создать docker образ с OpenCV 4.3 и моей собственной программой на C ++, связанной с OpenCV, обе созданы для Linux. Поскольку создание OpenCV занимает довольно много времени, а результирующее изображение docker довольно большое и мне нужны только libopencv_core.so
и libopencv_calib3d.so
, я попытался создать следующие два слоя :
- Сборка OpenCV из исходного кода и создание моей собственной программы на C ++, которая ссылается на OpenCV
- Скопируйте общие библиотеки OpenCV и мою скомпилированную программу, созданную на первом уровне сборки, на второй уровень и выполните мою программу
К сожалению, компоновщик выводит
error while loading shared libraries: libopencv_core.so.4.3: cannot open shared object file: No such file or directory
Добавление
RUN ls /usr/local/lib
во второй слой непосредственно перед тем, как команда для выполнения моей программы показывает, что я успешно скопировал файлы встроенной библиотеки. :
libopencv_calib3d.so
libopencv_calib3d.so.4.3
libopencv_calib3d.so.4.3.0
libopencv_core.so
libopencv_core.so.4.3
libopencv_core.so.4.3.0
Я уже пробовал эти операторы, чтобы сделать библиотеки видимыми:
RUN ldconfig /usr/local/lib
RUN export LD_LIBRARY_PATH="/lib:/usr/lib:/usr/local/lib"
RUN ldconfig -v
, где ldconfig -v
печатает (среди прочего):
/usr/local/lib:
libopencv_calib3d.so.4.3 -> libopencv_calib3d.so.4.3.0
libopencv_core.so.4.3 -> libopencv_core.so.4.3.0
Я был немного смущен, потому что ldconfig
не перечислил libopencv_calib3d.so
, поэтому я попытался создать simlink вручную, но он пожаловался, что libopencv_calib3d.so
уже существует. Таким образом, кажется, что все есть, чтобы запустить мою программу. Любые предложения, что я делаю не так?
Приложение
Это Dockerfile, который я использую (сокращено до важных частей):
FROM vookimedlo/ubuntu-clang:clang_bionic AS builder
# Install dependencies
RUN apt-get update & ...
ARG libPath=/usr/local/lib
# Install OpenCV
RUN git clone & cmake & make install
tar -czvf ${libPath}/opencv.tar.gz /usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_calib3d.so.4.* /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_core.so.4.*
# Download and build my program
...
FROM ubuntu AS runtime
ARG libPath=/usr/local/lib
# Copy compiled libraries
COPY --from=builder ${libPath}/opencv.tar.gz ${libPath}/opencv.tar.gz
RUN tar -xvf ${libPath}/opencv.tar.gz -C / && rm ${libPath}/opencv.tar.gz
# Copy my program
...
RUN ldconfig /usr/local/lib
RUN export LD_LIBRARY_PATH="/lib:/usr/lib:/usr/local/lib"
RUN ldconfig -v
# Run my program
CMD ...