Как скопировать файлы библиотеки между этапами многоэтапной сборки Docker при сохранении символических ссылок?

У меня есть Dockerfile, который разбит на двухэтапную многоэтапную сборку Docker. На первом этапе создается базовая среда сборки gcc, в которой компилируется несколько библиотек C и C ++. Второй этап использует COPY --from= Команда для копирования файлов библиотеки с первых этапов /usr/local/lib/libproto* к текущему изображению.

Проблема, которую я вижу, состоит в том, что первое изображение содержит символические ссылки из общего имени файла библиотеки на конкретное версионное имя файла. AFAIK, это обычная практика в Debian и многих других системах Linux. Docker-х COPY Команда, похоже, не понимает символические ссылки, поэтому вместо этого делает две полные копии библиотечных файлов. Это приводит к увеличению размера Docker Image и последующим предупреждениям apt-get команды на мелодию ldconfig: /usr/local/lib/libprotobuf.so.17 is not a symbolic link,


Мой конкретный файл в настоящее время выглядит так:

#Compile any tools we cannot install from packages
FROM gcc:7 as builder
USER 0
RUN \
apt-get -y update && \
apt-get -y install \
clang \
libc++-dev \
libgflags-dev \
libgtest-dev
RUN \
# Protocol Buffer & gRPC
# install protobuf first, then grpc
git clone -b $(curl -L https://grpc.io/release) \
https://github.com/grpc/grpc /var/local/git/grpc && \
cd /var/local/git/grpc && \
git submodule update --init && \
echo "--- installing protobuf ---" && \
cd third_party/protobuf && \
./autogen.sh && ./configure --enable-shared && \
make -j$(nproc) && make install && make clean && ldconfig && \
echo "--- installing grpc ---" && \
cd /var/local/git/grpc && \
make -j$(nproc) && make install && make clean && ldconfigFROM debian
LABEL \
Description="Basic Debian production environment with a number of libraries configured" \
MAINTAINER="Mr Me"ARG prefix=/usr/local
ARG binPath=$prefix/bin
ARG libPath=$prefix/lib
# Copy over pre-made tools
# Protocol Buffer
COPY --from=builder /usr/local/lib/libproto* $libPath/
# gRPC
COPY --from=builder /usr/local/lib/libaddress_sorting.so.6.0.0 $libPath/
COPY --from=builder /usr/local/lib/libgpr* $libPath/
COPY --from=builder /usr/local/lib/libgrpc* $libPath/
RUN ldconfig
# Install remaining tools using apt-get
RUN apt-get -y update && \
apt-get -y install \
libhdf5-dev \
libssl1.1 \
uuid-dev;

Как вы видите, я пытаюсь добавить последние версии gRPC и Protocol Buffer в образ среды выполнения на основе Debian.

1

Решение

Это скорее обходной путь, чем ответ.

Вы можете скопировать файлы, скопировать их во второй контейнер и распаковать их.

деготь поддерживает символические ссылки по умолчанию.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]